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

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

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

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