c++内存对齐

什么是内存对齐?

内存对齐:是计算机对数据类型合法地址做出了一些限制,要求某种类型对象的地址必须是某个值K(通常使2、4、8、16、32或64)的倍数。

为什么需要内存对齐?

  • 不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
  • 对于未对齐的内存,处理器可能需要访问两次内存才能将数据完全读出,而对于对齐的内存,处理器只需要一次即可。

内存对齐规则?

可以通过预编译命令#pragma pack(n)来指定有效对齐值。

    注意:并不是说n就是有效对齐值,可以理解为建议以n为有效对齐值,实际有效对齐值还要根据结构体成员大小来决定,如果n的值比结构体数据成员的大小**小**才起作用。
  • 结构体数据成员对齐规则:第一个成员放在offet(偏移量)为0的地方,以后每个数据成员的offset按照该成员的大小和有效对齐值中较小的整数倍,即

           有效对齐值=min(数据成员类型大小,n)
                  offset=有效对齐值∗整数倍
    
  • 结构体对齐规则:在数据成员对齐后,结构体本身也要对齐,其总大小为有效对齐值的整数倍,即

          有效对齐值=min(数据成员类型大小,n)
                 offset=有效对齐值∗整数倍
    
  • 结构体作为数据成员:对于数据成员是结构体的情况,则该结构体成员要从其内部最大数据成员大小的整数倍地址开始存储

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值