现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问都可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就是对齐。
结构体对齐包括两个方面的含义
1)结构体总长度;
2)结构体内各数据成员的内存对齐,即该数据成员相对结构体的起始位置;
一、字节对齐的原因大致是如下两条
1、平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
2、性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。
二、没有#pragmapack宏的情况下的对齐原则
原则 1、数据成员对齐规则:结构( struct 或联合 union)的数据成员,第一 个数据成员放在offset为 0 的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如 int 在 32 位机为4字节,则要从4 的整数倍地址开始 存储,char为一个字节,要从1的整数倍开始,也即是下面的要求)。
- 1 字节:char, …