1、 对于结构的各个成员,第一个成员位于偏移为0的位置,以后每个数据成员的偏移量必须是min(#pragma pack()指定的数,这个数据成员的自身长度) 的倍数。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既满足。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |