代码之家  ›  专栏  ›  技术社区  ›  Tomas

虚继承下的C++ VTE解析

  •  2
  • Tomas  · 技术社区  · 15 年前

    我对C++和虚拟继承很好奇,尤其是在低音和子类之间解决了VTABLE冲突的方式。我不会假装理解它们如何工作的细节,但到目前为止我所了解到的是,它们是由于那个解决方案而使用虚拟函数造成的一个小延迟。我的问题是,如果基类是空的,那么它的虚拟函数定义为:

    virtual void doStuff() = 0;
    

    这是否意味着不需要解析,因为只有一组函数可供选择?

    如果这是一个愚蠢的问题,请原谅我——正如我所说,我不明白vtables是如何工作的,所以我真的不太了解。

    编辑

    所以如果我有一个抽象类和两个独立的子类:

        A
       / \
      /   \
     B     C
    

    当从子类调用函数时,性能不会受到影响,比如说,仅仅是一个无继承性的类?

    3 回复  |  直到 11 年前
        1
  •  5
  •   Mark B    15 年前

    打电话没有成功 非虚的 子类中的函数。如果您像在示例中那样调用纯虚拟函数的重写版本,那么虚拟惩罚可能仍然存在。一般来说,编译器很难优化虚拟表的使用,除非在非常特殊的情况下,在这种情况下,编译器知道所讨论对象的确切的按值类型(从上下文)。

    但说真的,不要担心开销。这将是如此之少,以至于在实践中,您几乎肯定不会遇到这样的情况:它是导致性能瓶颈的代码的一部分。使用对您的设计有意义的虚拟功能,而不必担心(微小的)性能损失。

        2
  •  2
  •   AnT stands with Russia    15 年前

    我不知道你在说什么“一套功能”。你有两个派生类- B C -每个都有自己的一组虚拟函数。所以,你至少有 设置,即使所有函数都位于 A 是纯洁的。

    当编译器不知道正在使用的对象的动态类型时,就会发生虚拟调度。例如,如果您有一个指针 A *p ,它可以指向类型为的对象 或类型 C . 如果编译器不知道对象的实际类型 p 指向,它必须使用虚拟调度才能通过 .

    另外,在您的示例中没有“虚拟继承”。术语 虚拟继承 在C++中有它自己的意思。你不是在说虚拟继承。

        3
  •  0
  •   John Weldon user3678248    15 年前

    “双调度”命中仅在方法为虚拟时发生。如果派生方法不是虚拟的,则不会影响性能。