On 24 Apr 2015, at 13:01, Chris Torek <to...@elf.torek.net> wrote: > > The problem seems likely to be related to odd compiler handling of > alignment. Consider this code bit, which extracts the essentials: > > struct x { > int x; > } __attribute__((__aligned__(32))); > > struct s1 { > int a; > struct x b[1]; > }; > > struct s2 { > int a; > struct x b[]; > }; > > extern void test2(int); > void test(void) { > test2(sizeof(struct s1)); > test2(sizeof(struct s2)); > } > > Compiled, here are the two sizeof values (this particular compiler > output is from clang but gcc and clang both agree on sizeof here): > > movl $64, %edi > callq test2 > movl $32, %edi > popq %rbp > jmp test2 # TAILCALL > > With the flexible array, (sizeof(struct uma_cache)) is going to be > 32 bytes smaller than without it. > > (I have not looked closely enough to determine what the size should be.)
I'm not sure I would consider this odd. For purposes of sizeof(), the flexible array member declaration can be thought of as: struct x b[0]; so while both struct s1 and s2 have members that must be aligned at 32 bytes, the former has one extra, while the latter doesn't. Ergo, 2x32 bytes and 1x32 bytes. -Dimitry
signature.asc
Description: Message signed with OpenPGP using GPGMail