【问题标题】:size of derived class object in virtual inheritance虚拟继承中派生类对象的大小
【发布时间】:2013-12-28 07:42:58
【问题描述】:
class base
{
};

class der_1:public base
{
};

class der_2:virtual public base
{
};

int main()
{
    der_1 a;  //size of a is 1
    der_2 b;  //size of b is 4  ?? why
    cout<<sizeof(a)<<endl;
    cout<<sizeof(b)<<endl;
    return 0;
}

object b 内部包含虚拟指针,所以它的大小是 4 而不是 1(像 a)。 但是这个虚拟指针指向的是什么?

【问题讨论】:

    标签: c++


    【解决方案1】:

    这完全取决于实现。这取决于实现如何实现动态调度/虚拟化。这就是 C++ 标准库提供 sizeof 以获取实际大小的原因,这样您就不必猜测/估计它。始终使用它而不是对大小做出任何假设。

    但是大多数实现(全部阅读)使用虚拟表和指针机制来实现这一点,并且您看到的额外 4 字节大小用于 vptr 簿记。

    【讨论】:

      【解决方案2】:

      它可能指向类的虚函数表。在大多数实现中,这对于允许 dynamic_cast 之类的东西起作用是必要的。

      【讨论】:

      • 但是 der_2 类没有任何虚函数。那么它的虚拟表是怎么可能的呢?
      • @AdityaSharma - 它具有虚拟继承。这足以(绰绰有余!)触发对可行的需求。此外,从没有虚拟析构函数的基类继承是个坏主意。假设遵循核心原则,编译器会发出代码。编译器没有理由对从没有虚拟方法的基类虚拟继承的类进行特殊的大小缩减处理。这没有意义。
      【解决方案3】:

      指针的大小会因机器而异。例如在我的机器上,它是8

      Size of the classes in case of virtual inheritance

      当你有虚拟继承时,虚拟的位置 相对于完整类型的开始的基本子对象是 未知,因此在原始对象中添加了一个额外的指针以进行跟踪 虚拟基地在哪里。

      Does virtual inheritance increase the size of derived class?

      此行为完全特定于实现并且没有 保证会发生什么。也就是说,大多数编译器实现 通过拥有一个基类的副本来实现虚拟继承 周围,​​然后让派生类的每个实例存储一个指针 在其指向该唯一实例的类体内。那 方式,如果你将对象转换为它的虚拟基础,编译器可以发出 代码来找出该对象在哪里。在 32 位系统上,这意味着 虚拟继承可能会将对象的大小增加四倍 字节,正如您所观察到的那样。

      【讨论】:

        猜你喜欢
        • 2013-02-26
        • 2020-02-01
        • 2019-12-20
        • 2020-10-26
        • 1970-01-01
        • 2016-03-04
        • 2015-07-13
        • 2023-03-22
        相关资源
        最近更新 更多