一般情况下,编译器会把struct中的成员作对齐处理,所以sizeof后不是等于所以成员大小之和。
VC编译器做对齐处理的步骤如下(个人理解):
1、首先获得struct中的大小最大的基本数据类型成员的大小,称为内存分配基大小(以下简称:基大小),这里的最大成员为double d1,d1的大小为8,所以基大小为8;
2、按照顺序为struct中的成员分配内存:
(1)、分配一个大小等于基大小的内存;
(2)、从第一个到最后一个成员,取得每个成员的大小为N,调整可插入内存起始地址,使得(可插入内存起始地址 - struct起始地址) 为N的倍数(向后移调整),从可插入内存起始地址 开始插入成员,如果分配的剩余空间大于这个成员的大小,则把struct的成员插进内存中,否则执行(1)。直到把所有成员插完为止。
3、此时struct的大小应该为基大小的倍数。
例如,
struct s{
};
内存分配情况如下:
可以看出,
struct s1{
};
和
struct s2{
};
是同大小的,s1中的d5和d6成员会恰好填充偏移量14和15处。
再来看如下几个struct:
struct s1{
};
struct s2{
};
struct s3{
};
struct s4{
};
在VC编译器下,以上struct的大小为:
sizeof(s1)=16
sizeof(s2)=16
sizeof(s3)=24
sizeof(s4)=24
g++编译器下,以上struct的大小为:
sizeof(s1)=16
sizeof(s2)=16
sizeof(s3)=16
sizeof(s4)=16
为什么VC和g++的执行结果会不一样呢?原因是vc默认情况下不会对struct中成员排列进行优化,使得sizeof(struct)最小;而g++中默认情况是会对struct中成员排列进行优化,使得sizeof(struct)最小(本人猜测)。