结构体对齐

一、什么是结构体对齐?

  结构体对齐是指在初始化结构体时,按照一定的规则将结构体成员变量的内存地址进行调整,以提高内存读取效率。

二、结构体对齐规则

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) // 恢复之前的对齐方式

  

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值