to 楼上的:
我在上一回贴中已纠正我的错误,就是double类型变量的自然对齐方式依然是被4整除,而不是被8整除,也就是说既然结构体本身能被4整除,它的第一个成员是double型,double型的自然对齐方式同样是被4整除,所以这个成员与结构体本身所在地址之间没有空洞的!!!!!!我之前没有想到double型的自然对齐方式是被4整除,而理解成了被8整除,这是我犯的错误,不好意思!!!!
这个和编译器有关
linux下就不同
struct st
{
int i[5];
double b;
int a;
};//结果是32;
struct st
{
int i[6];
double b;
int a;
};//结果也是36
struct st
{
int i[4];
double b;
int a;
char c;
};结果32;
struct st
{
int i[5];
int a;
double b;
};//结果是32
eg:
struct B
{
char b;
int a;
short c;
};
假设B从地址空间0x0000开始排放。该例子中没有定义指定对齐值,在笔者环境下,该值默认为4。第一个成员变量b的自身对齐值是1,比指定或者默认指定对齐值4小,所以其有效对齐值为1,所以其存放地址0x0000符合0x0000%1=0.第二个成员变量a,其自身对齐值为4,所以有效对齐值也为4,所以只能存放在起始地址为0x0004到0x0007这四个连续的字节空间中,复核0x0004%4=0,且紧靠第一个变量。第三个变量c,自身对齐值为2,所以有效对齐值也是2,可以存放在0x0008到0x0009这两个字节空间中,符合0x0008%2=0。所以从0x0000到0x0009存放的都是B内容。再看数据结构B的自身对齐值为其变量中最大对齐值(这里是b)所以就是4,所以结构体的有效对齐值也是4。根据结构体圆整的要求,0x0009到0x0000=10字节,(10+2)%4=0。所以0x0000A到0x000B也为结构体B所占用。故B从0x0000到0x000B共有12个字节,sizeof(struct B)=12;