C++学习记录 - 内存对齐

为什么要内存对齐?

经过内存对齐之后,一个最最主要的原因是可以使得CPU的内存访问速度大大提升。
  内存空间按照byte划分,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。

用空间换时间!

CPU在读内存的时候是n个为一组的方式去读。
假设此时4个字节为一组去读。

内存对齐之后的内存空间如下图:
在这里插入图片描述
这样的话,只需要读内存2次。
在这里插入图片描述
先从第一组读,然后扣除0位置,a就读取结束了。
读b的时候,先读第一组,扣除1,2,3。然后读第二组,扣除4,拼起来组成变量b。

这样的话。一共读了3次。

内存对齐的原则?

#pragma pack(N); // N 字节对齐; 默认为4(32位), 8(64位)

  1. 数据成员对齐规则:
    * 第一个成员offset = 0;
    * 后面每个成员的起始位置为:min( N, 自身长度) 的 倍数

  2. 如果成员中有结构体,那么该结构体的起始位置为,min( N, 结构体内部所有成员最大长度) 的倍数

  3. 结构体的总大小,也就是sizeof的结果,必须是 min(#pragram pack() , 长度最长的数据成员) 的整数倍

注意,N必须为1,2,4,8…这种才生效,否则的话,都是按默认的字节数进行对齐。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值