C++ 为什么在虚拟继承的情况下类的大小更大?

C++ 为什么在虚拟继承的情况下类的大小更大?,c++,inheritance,virtual,C++,Inheritance,Virtual,虚拟基类是一种在使用多重继承时防止给定类的多个实例出现在继承层次结构中的方法。接下来的课程 class level0 { int a; public : level0(); }; class level10:virtual public level0 { int b; public : level10(); }; class level11 :virtual public level0 { int c; public :

虚拟基类是一种在使用多重继承时防止给定类的多个实例出现在继承层次结构中的方法。接下来的课程

class level0 {
    int a;
    public :
    level0();
};

class level10:virtual public level0 {
    int b;
    public :
    level10();
};

class level11 :virtual public level0 {
    int c;
    public :
    level11();
};

class level2 :public level10,public level11 { 
    int d;
    public:
    level2();
};
我得到了以下大小的班级

0-4级的大小

标高10 12的尺寸

标高11的尺寸12

标高2的尺寸24

但当我从level10和level11的继承中删除virtual时,我得到了以下输出

级别0 4的大小

级别10-8的大小

级别11的大小8

级别2 20的大小


如果虚拟继承阻止了一个基类的多个实例,那么为什么在虚拟继承的情况下类的大小更大?

因为当使用
虚拟继承时,编译器将创建*a以指向各个类的正确偏移量,并且指向该vtable的指针与类一起存储


  • “将创建”--vtables不受标准的约束,但虚拟继承所隐含的行为是。大多数编译器使用vtables来实现标准规定的功能
如中所示,很明显,如果使用虚拟继承,编译器会向点基类添加一个偏移指针,而不是将基类成员包含在自己的内存中。这就是增加尺寸的原因。如果为x64位m\c,指针大小将为8。输出如下

0-4级的大小

标高10 16的尺寸

标高的大小11 16


level2 32的大小如果
level0
更大,效果会更好。事实上,它的大小在噪音中消失了。给它3或4个
int
数据成员,事情就会更清楚。@Marius nope的重复项,这个问题有一个
virtual
,这个问题有两个。答案使用单一的
虚拟的
作为尺寸描述的一部分:它不能作为上述问题的答案。好的,那么你运行这个的架构是什么?指针的大小与
int
的大小相比是多少?不是指向虚拟基对象的指针额外的4个字节,而vtable是指向虚拟函数实现的指针表。由于没有虚拟函数,编译器不应该添加vtables。