Code Tips: gcc對結構體的默認字節“對齊”方式


1. 發現問題

    最近在編寫代碼過程中發現,對一個結構體進行 sizeof 操作時,有時候大小是填充過的,有時候又沒有填充。

    那么,如果在代碼中沒有顯示的指定要求編譯器進行對齊時,gcc的默認處理是怎樣的呢?

2. 先說結論

  •     代碼中如果沒有顯示指定字節對齊時,gcc默認並沒有進行cpu寬度字節對齊;
  •     gcc會將結構體的大小填充為結構體最大成員的整數倍(如果結構體中的成員也是一個結構體,則查看這個成員的成員)

3. 實驗

    根據實驗代碼,可以清晰的理解gcc對結構體的默認處理行為

 1 /*--------------------------------------
 2  * struct_size.c
 3  * author: taopeng
 4  * -------------------------------------*/
 5 
 6 #include <stdio.h>
 7 #include <stdlib.h>
 8 
 9 /* 成員最大size為1, 無須再填充*/
10 typedef struct
11 {
12     char a;
13     char b;
14     char c;
15 }tTestEntry1;
16 
17 /* 成員最大size為2,需要將大小填充為2的倍數 */
18 typedef struct
19 {
20     char a;
21     char b;
22     char c;
23     short d;
24 }tTestEntry2;
25 
26 /* 成員最大size為4,需要將大小填充為4的倍數 */
27 typedef struct
28 {
29     char a;
30     int b;
31 }tTestEntry3;
32 
33 /* 成員最大size為4,需要將大小填充為4的倍數 
34  * 內部有結構體,繼續查看內部結構體成員 */
35 typedef struct
36 {
37     struct
38     {
39         char a;
40         int b;
41     }t;
42 
43     int c;
44 }tTestEntry4;
45 
46 int main(int argc, char *argv[])
47 {
48     printf("sizeof(tTestEntry1)=%lu\r\n", sizeof(tTestEntry1));
49     printf("sizeof(tTestEntry2)=%lu\r\n", sizeof(tTestEntry2));
50     printf("sizeof(tTestEntry3)=%lu\r\n", sizeof(tTestEntry3));
51     printf("sizeof(tTestEntry4)=%lu\r\n", sizeof(tTestEntry4));
52 
53     return 0;
54 }

 

輸出結果:

sizeof(tTestEntry1)=3
sizeof(tTestEntry2)=6
sizeof(tTestEntry3)=8
sizeof(tTestEntry4)=12

 


免責聲明!

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



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