一、什么是结构体对齐?
结构体对齐是指在初始化结构体时,按照一定的规则将结构体成员变量的内存地址进行调整,以提高内存读取效率。
二、结构体对齐规则
1)结构体数据成员的对齐规则
- 第一个数据成员存放的地址为结构体变量偏移量为0的地址处。
- 其他结构体成员自身对齐时,存放的地址为min{自身对齐值,指定对齐值}的整数倍的地址处。
- 32位平台,默认4Byte对齐;64位平台,默认8Byte对齐。
2)结构体整体的对齐规则
- 结构体的存放的地址为min{所有成员中最大的自身对齐值,指定对齐值}的整数倍的地址处。
三、依据结构体对齐的编程规范
1)【规则】禁止采用常量来表示变量长度、结构体长度,应当使用sizeof来获取
不同平台,不同的对齐长度会导致结构体的长度不同。sizeof在编译器计算完成,不会影响运行性能。
2)【规则】不能通过地址偏移量来获取数据成员,只能通过成员名称。
不同平台,不同的对齐长度会导致数据成员的地址偏移量不同
3)【建议】涉及通信的消息结构体,需要对齐统一。基于兼容性考虑,可优先采用1字节对齐;
#pragma pack(push, 1) // 设置对齐方式为1字节对齐
struct test
{
......
};
#pragma pack(pop) // 恢复之前的对齐方式