结构体对齐规则及示例
为什么要进行内存对齐(以空间换时间)
为了有助于加快计算机的取数速度,编译器默认会对结构体进行处理(实际上其
它地方的数据变量也是如此),让宽度为2的基本数据类型(short等)都位于能被2整除的地址上,让宽度为4的基数据类型(int等)都位于能被4整除的地址上,能整除的话一次就读完了,会节省很多时间,这样两个数中间就可能需要加入填充字节,所以整个结构体的sizeof值就增长了。
结构体对齐规则
1. 第一个成员在与结构体变量偏移为0的地址处
2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处
对齐数=编译器默认的一个对齐数与该成员大小的较小值
vs中的默认值为8
3. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍
4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己最大对齐数的整数倍处,
结构体的整体大小就是所有最大对齐数(含嵌套结构体的大小)
示例1:
对于c1来说它占一个字节,vs编辑器默认为8,所以它的对齐数为1
对于 i 来说,它占四个字节,vs编辑器默认为8,所以它的对齐数为4,也就是它要放之前前面的格子必须它(4)的整数倍,所以前边空了三个格子(红笔写的为空的数)
对于c2来说它占一个字节,vs编辑器默认为8,所以它的对齐数为1,也就是它要房之前前面的格子必须是1的整数倍,所以直接放,然而结构体总大小为最大对齐数的整数倍1+3+4+1=9还差三个才是最大对齐数(在这个代码中最大对齐数为4)的整数倍,所以9+3=12,也就是这个结构体大小为12
示例2:
1 (c1) + 1(c2) + 2(int对齐) + 4(int大小) = 8 即这个结构体大小为8
示例3:
8(double大小) + 1(char大小) + 3(int对齐) + 4(int大小) =16
示例4: 划重点
struct S3 s3 这个结构体大小为 16 ,它内部最大对齐数 为8
1(char大小) + 7(结构体变量s3对齐) + 16(结构体s3所占空间大小) + 8(double大小)
总值为32