所以从0x0000到0x0007共八字节存放的是struct C的变量。又struct C的自身对齐值为4,所以struct C的有效对齐值为2。
又8%2=0,struct C只占用0x0000到0x0007的八个字节。所以sizeof(struct C)=8。
如果把上面的#pragma pack(2)改为#pragma pack(4),那么我们可以得到结构的大小为12。
*/
//再看下面这个例子
//
#pragma pack(8)
struct S1
{
char a;
long b;
};
struct S2 {
char c;
struct S1 d;
long long e;
};
#pragma pack()
sizeof(S2)结果为24.
/*
S1中:
成员a是1字节默认按1字节对齐,指定对齐参数为8,这两个值中取1,a按1字节对齐;
成员b是4个字节,默认是按4字节对齐,这时就按4字节对齐,所以sizeof(S1)应该为8;
S2 中:
c和S1中的a一样,按1字节对齐,
d 是个结构,它是8个字节,它按什么对齐呢 对于结构来说,它的默认对齐方式就是它的所有成员使用的对齐参数中最大的一个,S1的就是4.所以,成员d就是按4字节对齐.
成员e是8个字节,它是默认按8字节对齐,和指定的一样,所以它对到8字节的边界上,这时,已经使用了12个字节了,所以又添加了4个字节的空,从第16个字节开始放置成员e;
长度为24,已经可以被8(成员e按8字节对齐)整除.一共使用了24个字节.
a b
S1的内存布局:11**,1111,
c S1.a S1.b d
S2的内存布局:1***,11**,1111,****11111111
*/
//再看下面这个例子
//
#pragma pack(8)
struct S1
{
char a;
long b;
};
struct S2 {
char c;
struct S1 d;
long long e;
};
#pragma pack()
sizeof(S2)结果为24.
/*
S1中:
成员a是1字节默认按1字节对齐,指定对齐参数为8,这两个值中取1,a按1字节对齐;
成员b是4个字节,默认是按4字节对齐,这时就按4字节对齐,所以sizeof(S1)应该为8;
S2 中:
c和S1中的a一样,按1字节对齐,
d 是个结构,它是8个字节,它按什么对齐呢 对于结构来说,它的默认对齐方式就是它的所有成员使用的对齐参数中最大的一个,S1的就是4.所以,成员d就是按4字节对齐.