1. 程式人生 > 實用技巧 >Linux雜談: gcc對結構體的預設位元組“對齊”方式

Linux雜談: 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