要了解结构体对齐 ,必须要知道:基本变量如 CHAR、INT 也是存在对齐问题,并且,对齐是以空间换速度,可以用命令(如#pragma pack(n))进行n字节对齐或解除对齐;编译器会根据不同的系统进行默认对齐。
万变不离其宗,默认的对齐准则是:基本变量的存放地址能整除 基本变量的宽度(比如32位机的int为32/8=4,这里是以字节为单位);对于结构体,其首地址能整除 体内最大的基本变量的宽度。
结构体的内存对齐,其实包括两点:
1.结构体首地址的对齐。如上面所说,其首地址能 整除 体内最大的基本变量的宽度;并且结构体的SIZEOF()是最大的基本变量的宽度的整数倍;
2.结构体内部元素的地址对齐。 基本变量的存放地址能 整除 基本变量的宽度(比如32位机的int为32/8=4)。并且结构体的成员是按照顺序存放在内存当中的。
如果结构体内包括结构体成员,原理一样,限制结构体首地址的是结构体内部的最大宽度基本变量成员。
如果进行了#pragma pack(n)限制,其实际的对齐值为 n与变量本身宽度 两者中的最小者。