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