情況:
- #include <stdio.h>
-
- struct STR
- {
- double a;
- int b;
- int c;
- char d;
- };
-
- struct STR1
- {
- double a;
- char b;
- int c;
- };
-
- struct STR2
- {
- char a;
- double b;
- int c;
- };
-
- struct STR3
- {
- char a;
- double b;
- int c;
- char d;
- };
-
- int main()
- {
- printf("sizeof(struct STR)=%d.\n", sizeof(struct STR));
- printf("sizeof(struct STR1)=%d.\n", sizeof(struct STR1));
- printf("sizeof(struct STR2)=%d.\n", sizeof(struct STR2));
- printf("sizeof(struct STR3)=%d.\n", sizeof(struct STR3));
- return 0;
- }
輸出結果:
- gcc version 4.1.2 20080704 (Red Hat 4.1.2-50)
- sizeof(struct STR)=20.
- sizeof(struct STR1)=16.
- sizeof(struct STR2)=16.
- sizeof(struct STR3)=20.
STR: 8+4+4+1=17,同時要求4的倍數,為20。
STR1: 8+1+3+4=16,其中char後面填充了3個字節,因為int必須是4字節對齊,同時16已經為4的倍數。
STR2: 1+3+8+4=16,同上。
STR3: 1+3+8+4+1=17,通STR,結果為20。
一般在VC上結果不同,
VC按照具體的對齊,例如char, double,則一定是16,以double的8對齊,但是GCC中最大以4字節對齊,即使用了
- #pragma pack(8)
也就是說,在GCC下pack命令只有小於等於4才生效。
同樣也就有另一個問題,就是最終大小,在GCC中,要求是最大變量大小的整數倍,但是不超過4字節的倍數,但是VC中,是按照實際大小倍數。