結構體大小的計算,。網上說法一大堆還都不一樣分什么對齊不對齊,偏移量什么的。。
在此稍微舉例簡單總結下:
對齊原則:每一成員的結束偏移量需對齊為后一成員類型的倍數
補齊原則:最終大小補齊為成員中最大值的倍數
拿個題目做例子:【
(開始偏移量)+此處字節 = 結束偏移量】
1 struct MyStruct 2 { 3 int i; // (0) + 4 = 4,后面一個為2,已經對齊 4 char c; // (4) + 1 = 5,后面一個為結構體,直接拆開看第一個,int=4,所以對齊為(4) + 4 = 8 5 struct InnerStruct 6 { 7 int i; // (8) + 4 = 12,下一個為4,已經對齊(學java注意了,32位下C語言的long為4,和java不一樣) 8 long l; // (12) + 4 = 16,下一個為8,已經對齊 9 double d; // (16) + 8 = 24,下一個為1,已經對齊 10 char c; // (24) + 1 = 25,這是最后一個,將其對齊為最大值8的倍數,所以補齊為 (24) + 8 = 32,最后結果=32 11 } innerStruct; 12 };
【注意】如果
指定對齊字節,則在對齊的時候將此指定與下一個的進行比較,取較小的那個進行對齊。
在補齊的時候,與最大的進行比較,也取較小的那一個進行補齊。
代碼如下:
1 struct A { 2 char b; 3 int a; 4 short c; 5 }; 6 7 #pragma pack (2) /*指定按2字節對齊*/ 8 struct B { 9 char b; 10 int a; 11 short c; 12 }; 13 #pragma pack () /*取消指定對齊,恢復缺省對齊*/ 14 15 16 17 #pragma pack (1) /*指定按1字節對齊*/ 18 struct C { 19 char b; 20 int a; 21 short c; 22 }; 23 #pragma pack ()/*取消指定對齊,恢復缺省對齊*/ 24 25 //計算所占字節 26 int s1=sizeof(struct A); 27 int s2=sizeof(struct B); 28 int s3=sizeof(struct C); 29 30 printf("%d\n",s1); 31 printf("%d\n",s2); 32 printf("%d\n",s3);
輸出結果: 12 //按下一個進行對齊,按最大進行補齊 8 //按2進行對齊和補齊 7 //按1進行對齊和補齊,相當於直接計算每個大小然后相加