三原则:
1。每个成员按照自己的方式对齐,并能最小化长度
2.复杂类型(如结构)的默认对齐方式是它最长的成员的对齐方式,这样在成员是复杂类型时,可以最小化长度。
3.对齐后的长度必须是成员中最大的对齐参数的整数倍,这样在处理器组时可以保证每一项边界对齐。
每个成员按其类型的对齐参数(通常是这个类型的大小)和指定对齐参数(#pragma pack(n))中较小的一个对齐,即(min(n,sizeof(item))),并且结构的长度必须为所有用过的所有对齐参数的整数倍,不够就补空字节。
例如:
#pragma pack(8)
struct TestStruct4
{
char a;
long b;
};
struct TestStruct5
{
char c;
TestStruct4 d;
long long e;
};
a对齐参数8,但默认1字节对齐,所以按1字节对齐。
b对齐参数8,但默认4字节对齐,所以按4字节对齐。
那么其布局是:(a)1XXX (X是B对于其的补空字节)
(b)1111 (由于b是4,所以起始地址应该是4的倍数,所以a填充3个字节)
所以sizeof(TestStruct4)应该为8
TestStruct5 :
c对齐参数1,
d为8已经确定
e是8字节,对齐方式也是8
TestStruct5布局为:
c d.a d.b(结构为最长成员的对齐方式为4) e(对齐为8)
1***, (对齐为4)1***, 1111 ,**** (对齐为8,前面只有12,所以要为8的倍数必须为16,所以填充4字节)11111111
阅读(1463) | 评论(0) | 转发(0) |