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