http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52991
--- Comment #5 from Mikael Pettersson <mikpe at it dot uu.se> 2012-08-22 08:34:46 UTC --- The following variation of the test case was compiled with both gcc-4.7.1 and MS Visual Studio 2008: #include <stdio.h> #if defined(__GNUC__) struct A1 { short s; struct { int i; } x; } __attribute__((__packed__)); #endif #pragma pack(1) struct A2 { short s; struct { int i; } x; }; #pragma pack() int main(void) { #if defined(__GNUC__) printf("sizeof(struct A1) == %u\n", (unsigned)sizeof(struct A1)); #endif printf("sizeof(struct A2) == %u\n", (unsigned)sizeof(struct A2)); return 0; } Note that structs A1 and A2 are identical, except A1 is packed (when compiled by gcc) using the attribute syntax and A2 is packed using the #pragma syntax. Compiling this with gcc-4.7.1 (target x86_64-w64-mingw32) with -mms-bitfields (which is the default) gives: sizeof(struct A1) == 8 sizeof(struct A2) == 6 proving that attribute packed doesn't work. With -mno-ms-bitfields both structs are reported as being 6 bytes. Compiling with Visual Studio 2008 gives: sizeof(struct A2) == 6 as expected.