I\'m trying to understand how stack alignment works as described in what is "stack alignment"? but I have trouble getting a small example to demonstrate the said b
You can check how extra memory is allocated for your data structure using a tool called pahole http://packages.debian.org/lenny/dwarves . It shows you all the holes of your program: the size of your data if you sum it up and the real size allocated at your stuck
The usual rule is that variables are allocated on 32-bit boundaries. I'm not sure why you think 16 bytes has any special meaning.
I think you're missing the fact that there is no requirement for all stack variables to be individually aligned to 16-byte boundaries.
A good example is to see this on a structure.
struct a{
int a;
char b;
int c;
} a;
On a 32 bit system this would be 4+1+4 bytes if taken separately.
Because the structure and it's members are aligned "char b" will be 4 bytes, taking this to 12 bytes.
struct b{
int a;
char b;
int c;
} __attribute__((__packed__)) b;
Using the packed attribute you can force it to keep it's minimum size. Thus this structure is 9 bytes.
You can check this as well http://sig9.com/articles/gcc-packed-structures
Hope it helpes.
I've never heard about such a thing as specific stack alignment. If there is alignment requirements for the CPU, alignment is done on all kinds of data memory, no matter if it is stored on the stack or elsewhere. It is starting on an even addresses with 16, 32 or 64 bit of data following.
16 bytes may perhaps be some sort of on-chip cache memory optimization, though that seems a bit far-fetched to me.