结构体大小的计算,。网上说法一大堆还都不一样分什么对齐不对齐,偏移量什么的。。
在此稍微举例简单总结下:
对齐原则:每一成员的结束偏移量需对齐为后一成员类型的倍数
补齐原则:最终大小补齐为成员中最大值的倍数
拿个题目做例子:【(开始偏移量)+此处字节 = 结束偏移量】
1 struct MyStruct 2 { 3 int i; // (0) + 4 = 4,后面一个为2,已经对齐 4 char c; // (4) + 2 = 6,后面一个为结构体,直接拆开看第一个,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\n",s1); 31 printf("%d\n",s2); 32 printf("%d\n",s3);
输出结果: 12 //按下一个进行对齐,按最大进行补齐 8 //按2进行对齐和补齐 7 //按1进行对齐和补齐,相当于直接计算每个大小然后相加