自定义类型-结构体(二)
结构体内存对齐
偏移量
指的是结构体中某个成员相对于结构体起始地址的字节距离
第一个成员的起始位置为0,一个字节表示一个单位
这里的数字表示的是该成员地址与结构体首地址之间的值
对齐规则
1.结构体第一个成员的第一个字节的偏移量为0
2.其余成员变量要对⻬到某个数字(对⻬数)的整数倍的地址处
对齐数:编译器有一个默认的对齐数,这个数与成员变量的的大小进行对比,小的一方为该成员变量的对齐数
其余成员的变量要存储在对齐数的整数倍
例:第一个为char类型大小为1,第二个为int 大小为4个字节,第二个成员的对齐数是4(4比8小),因此存放的位置是4的倍数,因为第一个成员的大小为1,没有超过4,所以存放的位置为偏移量4
3.结构体的总体的大小,必须是最大对齐数的整数倍
以上述的例子为例
在设置第三个成员变量,char,大小为1字节,根据第二个规则,偏移量为8,因为最大的对齐数是4,而三个成员变量所使用的字节长度为9(以0开始计算),所以4的倍数8,就不能使用,只能使用12,因此该结构体的总体大小为12字节
4.当嵌套了结构体时结构体的总体大小是所以结构体的最大对齐数的倍数
修改默认对齐数
使用预处理指令“ #pragma ”可以修改编译器的默认对齐数
语法结构:#pragma pack
#pragma pack(n) // 设置新的对齐数为 n(通常为 1, 2, 4, 8, 16 等)
#pragma pack() // 恢复默认对齐数