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

Attachment: signature.asc
Description: Message signed with OpenPGP using GPGMail

Reply via email to