關於C語言中結構體大小計算


結構體大小的計算,。網上說法一大堆還都不一樣分什么對齊不對齊,偏移量什么的。。
在此稍微舉例簡單總結下:
對齊原則:每一成員的結束偏移量需對齊為后一成員類型的倍數 
補齊原則:最終大小補齊為成員中最大值的倍數
 
拿個題目做例子:【 (開始偏移量)+此處字節 = 結束偏移量
 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進行對齊和補齊,相當於直接計算每個大小然后相加
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM