http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54188

--- Comment #3 from Keith Thompson <Keith.S.Thompson at gmail dot com> 
2012-08-06 19:28:37 UTC ---
The results of the _Alignof operator (new in the 2011 ISO C standard)
are the same as for the __alignof__ operator (not surprisingly).

N1370 (C11 draft) 6.5.3.4 paragraph 3 says:

    The _Alignof operator yields the alignment requirement of its
    operand type.

Richard Guenther: You say it's "Because the ABI says so".  Do you have
a reference to the ABI, particularly to a statement that a structure
should have a smaller alignment than its member?

You also say __alignof__ "does not return the minimum but the
recommended alignment".  That seems inconsistent with the use of the
word "required" in C11.

I just grabbed a copy of http://www.uclibc.org/docs/psABI-i386.pdf;
is that the ABI you're referring to?  Figure 3-1 covers alignment
for scalar types.  It says 8-byte floating-point has an alignment
of 4 bytes, but it doesn't mention 8-byte integers.  Furthermore,
the following page says:

    Aggregates (structures and arrays) and unions assume the alignment
    of their most strictly aligned component.

That seems inconsistent with the behavior of the following program:

    #include <stdio.h>
    int main(void) {
        printf("_Alignof(long long) = %d\n",
               (int)_Alignof(long long));
        printf("_Alignof(struct {long long x;}) = %d\n",
               (int)_Alignof(struct {long long x;}));
        return 0;
    }

whose output on my system, with
    gcc -std=c11 -pedantic c.c -o c && ./c
is:

    _Alignof(long long) = 8
    _Alignof(struct {long long x;}) = 4

Reply via email to