#include<iostream>
using namespace std;
class abc
{
int a;
};
class xyz : public virtual abc
{
int b;
};
int main()
{
abc obj;
xyz obj1;
cout<<endl<<sizeof(obj);
cout<<endl<<sizeof(obj1);
return 0;
}
答案将取决于编译器,但当我看到这个结果时我感到很惊讶
~/Documents/workspace/tmp ‹.rvm-› $ ./class_sizes
4
16
如果我删除 virtual 关键字,那么分配的大小分别为 4 和 8,这是我所期望的。
为什么额外的空间被占用了? 我怀疑它是针对 vptr 表或类似的东西,但不确定。
最佳答案
一篇关于 GCC 中的虚拟和多重继承的好文章是 (Internet Archive Permalink) :
http://phpcompiler.org/articles/virtualinheritance.html
但它并没有完全回答您的问题,因为您从正在使用的任何(未指定的)编译器和build设置中获得 20 个字节的输出。
如果您使用的是 GCC (至少在 IDEone 使用的默认设置下),那么您将获得 12 个字节。这与您编写的内容相同:
class abc
{
int a;
virtual void foo() {}
};
class xyz : public abc
{
int b;
};
当 abc 包含虚拟方法时,您是否虚拟继承它:
class abc
{
int a;
virtual void foo() {}
};
class xyz : virtual public abc
{
int b;
};
...那么您将从 GCC 中获得 16 个字节。
Why is the extra space being taken up exactly? I suspect it is for the vptr table or something of that sorts but don't know for certain.
如果我必须对您的 16 字节方差做出大胆的猜测:我可能会调查您的编译器的虚拟继承实现是否将所有虚拟基类视为具有虚拟方法,即使它们没有?
但这几乎是我编造的。如果你想检验这个理论,你就必须深入研究。它依赖于实现。
关于c++ - C++中具有虚拟继承的类大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8105868/