C++中具有虚拟继承的类大小

nik*_*hil 6 c++ virtual-inheritance

#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;
}
Run Code Online (Sandbox Code Playgroud)

答案将取决于编译器,但当我看到这个结果时,我感到很惊讶

~/Documents/workspace/tmp ‹.rvm-›  $ ./class_sizes   

4
16
Run Code Online (Sandbox Code Playgroud)

如果我删除虚拟关键字,那么分配的大小分别为4和8,这正是我的预期.

为什么额外的空间被准确占用?我怀疑它是针对vptr表或其他类似但不确定的.

Hos*_*ork 7

GCC中有关虚拟和多重继承的好文章就是这篇文章(Internet Archive Permalink):

http://phpcompiler.org/articles/virtualinheritance.html

然而,它并没有完全回答你的问题,因为你正在从你正在使用的任何(未指定的)编译器和构建设置中获得20个字节的输出.

如果您使用GCC (在IDEone使用的默认设置下,至少),那么您将获得12个字节.这与你写的东西是一样的:

class abc
{
    int a;
    virtual void foo() {}
};
class xyz : public abc
{
    int b;
};
Run Code Online (Sandbox Code Playgroud)

当你包含虚拟方法时,你是否真的从abc继承:

class abc
{
    int a;
    virtual void foo() {}
};
class xyz : virtual public abc
{
    int b;
};
Run Code Online (Sandbox Code Playgroud)

...然后你会从GCC中获得16个字节.

为什么额外的空间被准确占用?我怀疑它是针对vptr表或其他类似但不确定的.

如果我不得不猜测你的16字节方差:我可能会研究一下你的编译器的虚拟继承实现是否将所有虚拟基类视为具有虚拟方法,即使它们没有?

但我几乎把它搞定了.如果你想测试理论,你将不得不进一步深入探讨; 它依赖于实现.