【问题标题】:Why size of classes is larger in case of virtual inheritance?为什么在虚拟继承的情况下类的大小更大?
【发布时间】:2013-06-21 09:40:01
【问题描述】:

虚拟基类是一种在使用多重继承时防止给定类的多个实例出现在继承层次结构中的方法。那么对于下面的类

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();
};

我得到了以下大小的类

level0 4 的大小

level10 12的大小

level11 12的大小

level2 24 的大小

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

level0 4 的大小

10 级大小 8

level11 8 的大小

20 级大小

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

【问题讨论】:

  • level0 越大,效果会越好。事实上,它的大小在噪音中消失了。给它 3 或 4 个 int 数据成员,事情会更清楚。
  • @Marius 不,那个问题有一个virtual,这个问题有两个。答案使用单个 virtual 作为尺寸描述的一部分:它不能作为上述答案。
  • 你在什么架构上运行它?指针的大小与int 的大小是多少?

标签: c++ inheritance virtual


【解决方案1】:

正如您在this 中看到的,很明显,如果使用虚拟继承,编译器会为指向基类添加一个偏移量指针,而不是将基类成员包含在自己的内存中。这就是增加尺寸的原因。如果是 x64 位 m\c,则指针大小为 8。输出如下

level0 4的大小

level10 16的大小

level11 16的大小

level2 的大小 32

【讨论】:

    【解决方案2】:

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


    • “将创建”——vtables 不是由标准规定的,但虚拟继承所暗示的行为是。大多数编译器使用 vtable 来实现标准规定的功能。

    【讨论】:

    • 不是指向虚拟基础对象的指针的额外 4 个字节,而 vtable 是指向虚拟函数实现的指针表。由于没有虚函数,编译器不应该添加 vtables。
    猜你喜欢
    • 2012-05-19
    • 1970-01-01
    • 2023-03-22
    • 2020-10-31
    • 2013-02-26
    • 2019-10-11
    • 1970-01-01
    • 2020-02-01
    相关资源
    最近更新 更多