http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47557
Jeffrey Yasskin <jyasskin at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |jyasskin at gcc dot gnu.org --- Comment #3 from Jeffrey Yasskin <jyasskin at gcc dot gnu.org> 2011-03-15 18:18:06 UTC --- Alignments on typedefs behave very strangely (PR48138). What you want is: typedef struct __attribute__((aligned(2))) { char a[3]; } T; unsigned x1 = sizeof(T); // sizeof is 4 unsigned x2 = sizeof(T[1]); // sizeof is 4 unsigned x3 = sizeof(T[2]); // sizeof is 8 unsigned x4 = sizeof(T[2][1]); // sizeof is 8 unsigned x5 = sizeof(T[1][2]); // sizeof is 8 Moving the attribute makes it apply to the struct instead of the typedef, which fixes everything. C1x and C++0x don't allow alignments on typedefs either.