Stack allocation, padding, and alignment
It's a gcc feature controlled by -mpreferred-stack-boundary=n
where the compiler tries to keep items on the stack aligned to 2^n
. If you changed n
to 2
, it would only allocate 8 bytes on the stack. The default value for n
is 4
i.e. it will try to align to 16-byte boundaries.
Why there's the "default" 8 bytes and then 24=8+16 bytes is because the stack already contains 8 bytes for leave
and ret
, so the compiled code must adjust the stack first by 8 bytes to get it aligned to 2^4=16.
The SSEx family of instructions REQUIRES packed 128-bit vectors to be aligned to 16 bytes - otherwise you get a segfault trying to load/store them. I.e. if you want to safely pass 16-byte vectors for use with SSE on the stack, the stack needs to be consistently kept aligned to 16. GCC accounts for that by default.