关于类的大小问题,有些是和编译器有关的。很多技术取决于编译器的具体实现。所以编译器不同,得到的结果有时会有所出入。下面所有的测试不加声明的话都是基于VS2005。
为使问题更加清晰,下面的讨论将不考虑对齐问题。
#pragma pack(1)
class a {
char i;
int ii;
};
class b: virtual public a{
char c;
};
class c: virtual public a{};
class d: public b, public c{};
#pragma pack()
int main(int argc, char *argv[])
{
cout << "a size is " << sizeof(a) << endl;
cout << "b size is " << sizeof(b) << endl;
cout << "b size is " << sizeof(c) << endl;
cout << "d size is " << sizeof(d) << endl;
system("PAUSE");
return EXIT_SUCCESS;
}
输出结果是:
5
10
9
14
理解以上问题的关键在于了解编译器对于虚函数以及虚基类的处理方法。
记得我第一次了解涉及到虚函数的类的内存布局是在Lipperman的
<Inside C++ Object Model> 中,中文版是由侯捷翻译的。书中讲到微软使用的所谓虚函数表,用来存储虚函数指针,这个估计大家都了解。其实虚函数表还有另一个用途就是用来存储虚基类的指针。指向虚基类的指针是以负数为下标存贮在虚表中的。
b的大小a的大小加上一个虚函数表指针的大小和一个b中成员变量的大小,也就是10。
c同理。
d的内存布局大致如下: