为了提高程序的性能,数据结构(尤其是栈)应该尽可能地在自然边界上对齐。因为为了访问未对齐的内存,处理器需要作两次内存访问。然而,对齐的内存访问仅需要一次访问。
1、数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照 #pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。
2、结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。
一般c++编译器默认的内存的对齐值为8个字节。对于下面的TEST结构体。因为其第一个字段为char所占字节为1,而第二个字段为int在32位系统中占4个字节,默认对齐值为8,宏观对齐值为4。因为char cNum1的字节大小为1地址为0x00AFFC50,所以其对齐值为1。int cNum2占4个字节所以对齐值为4,所以其首地址要能被4整除所以0x00AFFC51-0x00AFFC53用0xCC填充用来对齐。结构体总体大小为实际宏观对齐值与默认对齐值中较大的那个,所以sizeof(TEST)的大小为0x8.
如果结构体宏含有数组则用数组的类型参与对齐值的计算,不能按数组的总大小参与对齐值的运算。
如果结构体中含有结构体则应用结构体的对齐值参与对齐值的运算,而不能用结构体的大小参与对齐值的运算。
原文:https://www.cnblogs.com/revercc/p/13810678.html