0. 为什么要内存对齐?
经过内存对齐之后,一个最最主要的原因是可以使得CPU的内存访问速度大大提升。
内存空间按照byte划分,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。
用空间换时间!
CPU在读内存的时候是n个为一组的方式去读。
假设此时4个字节为一组去读。
内存对齐之后的内存空间如下图:
这样的话,只需要读内存2次。
先从第一组读,然后扣除0位置,a就读取结束了。
读b的时候,先读第一组,扣除1,2,3。然后读第二组,扣除4,拼起来组成变量b。
这样的话。一共读了3次。
1. 内存对齐的原则?
#pragma pack(N); // N 字节对齐; 默认为4(32位), 8(64位)
-
数据成员对齐规则:
* 第一个成员offset = 0;
* 后面每个成员的起始位置为:min( N, 自身长度) 的 倍数 -
如果成员中有结构体,那么该结构体的起始位置为,min( N, 结构体内部所有成员最大长度) 的倍数
-
结构体的总大小,也就是sizeof的结果,必须是 min(#pragram pack() , 长度最长的数据成员) 的整数倍
注意,N必须为1,2,4,8…这种才生效,否则的话,都是按默认的字节数进行对齐。