2、 在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。
如:
struct ex{ char a; double c; int b; };
char占一个字节,起始偏移为0 ,double 占8个字节,min(#pragma pack()指定的数,这个数据成员的自身长度) = 8(VC6默认8字节对齐),所以double按8字节对齐,起始偏移必须为8的倍数,所以起始偏移为8,在char后编译器会添加7个字节的额外字节,不存放任意数据。int占4个字节,按4字节对齐,起始偏移为16,正好是4的倍数,无须添加额外字节。到此规则1的数据成员对齐结束,此时的内存状态为:
oxxxxxxx|oooooooo|oooo
共占16个字节。还要继续进行结构本身的对齐,(规则2)对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行对齐,ex结构中最大数据成员长度为double,占8字节,而默认的#pragma pack 指定的值为8,所以结果本身按照8字节对齐,结构总大小必须为8的倍数,16既满足。