关于C语言中结构体大小计算

结构体大小的计算,。网上说法一大堆还都不一样分什么对齐不对齐,偏移量什么的。。
在此稍微举例简单总结下:
对齐原则:每一成员的结束偏移量需对齐为后一成员类型的倍数 
补齐原则:最终大小补齐为成员中最大值的倍数
 
拿个题目做例子:【(开始偏移量)+此处字节 = 结束偏移量
 1 struct MyStruct
 2 {
 3     int i; // (0) + 4 = 4,后面一个为2,已经对齐
 4     char c;  // (4) + 1 = 5,后面一个为结构体,直接拆开看第一个,int=4,所以对齐为(4) + 4 = 8
 5     struct InnerStruct
 6     {
 7         int i;  // (8) + 4 = 12,下一个为4,已经对齐(学java注意了,32位下C语言的long为4,和java不一样)
 8         long l;  //  (12) + 4 = 16,下一个为8,已经对齐
 9         double d;  //  (16) + 8 = 24,下一个为1,已经对齐
10         char c;  //  (24) + 1 = 25,这是最后一个,将其对齐为最大值8的倍数,所以补齐为 (24) + 8 = 32,最后结果=32
11     } innerStruct;
12 };  
【注意】如果指定对齐字节,则在对齐的时候将此指定与下一个的进行比较,取较小的那个进行对齐。
                在补齐的时候,与最大的进行比较,也取较小的那一个进行补齐。
代码如下:
 1 struct A {
 2     char  b;
 3     int   a;
 4     short c;
 5 };
 6 
 7 #pragma pack (2) /*指定按2字节对齐*/
 8 struct B {
 9     char  b;
10     int   a;
11     short c;
12 };
13 #pragma pack () /*取消指定对齐,恢复缺省对齐*/
14 
15 
16 
17 #pragma pack (1) /*指定按1字节对齐*/
18 struct C {
19     char  b;
20     int   a;
21     short c;
22 };
23 #pragma pack ()/*取消指定对齐,恢复缺省对齐*/
24 
25 //计算所占字节
26     int s1=sizeof(struct A);
27     int s2=sizeof(struct B);
28     int s3=sizeof(struct C);
29     
30     printf("%d
",s1);
31     printf("%d
",s2);
32     printf("%d
",s3);
输出结果:
12  //按下一个进行对齐,按最大进行补齐
8   //按2进行对齐和补齐 
7   //按1进行对齐和补齐,相当于直接计算每个大小然后相加
 
原文地址:https://www.cnblogs.com/Xieyang-blog/p/8724478.html