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