有效对齐值 = min(结构自身对齐值, 指定对齐值)。
1. 结构自身对齐值:
(1)基本数据类型:char --1, short -- 2, int --4;
(2) 结构体或类:所有成员自身对齐值中的最大值;
2. 指定对齐值
#pragma pack(value) ,另linux下还可用__attribute__() 来指定。
原因:在让每个成员在一次内存访问中被读取或写入。对于32位CPU,一次可以处理32位,也就是4个字节,
实际访问内存,它从4的整数倍的内存地址,一个可以读出4个字节,如地址在0、1、2、3的双字可以一次次处理,而4、5、6、7则要到下一次。
如果不对齐的话,可能出现这样的情况,一个字或是双字恰好跨越了两次访问的内容,比如说它在1、2、3、4,那么要取它的话,必然要访问两次内存。
这样会造成效率的下降。
编译器为结构分配的地址要对齐在“有效对齐值”的边界上,即若有效对齐值为N,地址为addr,则
addr % N == 0。
另外,结构体或类的大小有“圆整”要求,即sizof(struct X) % 有效对齐值 == 0。原因:考虑结构体数组,让连续
排列的另外的结构体也满足对齐要求。
在32位CPU上,gcc 和windows 默认是4字节对齐。