在C++中,一个空类的大小到底是多少呢?当你定义如下的一个类X时,你设想它的大小是多少?
class X {};
X的大小是0吗?请看下面的代码
#include <iostream>
using namespace std;
class X{};
class Y:public virtual X{};
class Z:public virtual X{};
class A:public Y,public Z{};
int main()
{
cout<<"size of X: "<<sizeof(X)<<endl;
cout<<"size of Y: "<<sizeof(Y)<<endl;
cout<<"size of Z: "<<sizeof(Z)<<endl;
cout<<"size of A: "<<sizeof(A)<<endl;
return 0;
}
以上代码在VC6.0的运行结果如下:
size of X: 1
size of Y: 4
size of Z: 4
size of A: 8
为什么一个空的类X会有占据1byte的内存空间呢?《Inside The C++ Object Model》给出了解释。
- 实际上一个空的类并不是空的,它有一个隐晦的1byte,那是被编译器安插进去的一个char。这使得这个class的两个objects得以在内存中配置独一无二的地址,对两个不同的object加以区分。
- 在一些编译器的实现中,类似Y和Z这种情况,它们的大小将有可能是8bytes,其中包括从X继承来的1byte,指向虚基类的指针4bytes(32位系统),即Y和Z的大小是 1+4 = 5 bytes,由于编译器对内存边界对齐的要求,5bytes实际上会被调整为 8 bytes (32位系统)。
- 在其他编译器上,这种对于空类的虚继承会有特殊的优化处理。即子类只包含一个指向虚基类的指针,占用 4bytes,而不会从虚基类中继承额外的1byte,这也是VC6处理的方式,因此,在本例中,class Y和Z的大小都是4bytes。
- class A继承了Y 和 Z的各自4bytes,因此在VC6环境下,最后的结果是4+4 = 8 bytes