C++ vtable使用虚拟继承进行解析

Tom*_*mas 2 c++ virtual virtual-functions vtable

我对C++和虚拟继承感到好奇 - 特别是在低音和子类之间解决vtable冲突的方式.我不会假装了解它们如何工作的具体细节,但到目前为止我发现的是由于该分辨率使用虚拟函数导致的延迟很小.我的问题是基类是否为空 - 即,其虚函数定义为:

virtual void doStuff() = 0;
Run Code Online (Sandbox Code Playgroud)

这是否意味着分辨率不是必需的,因为只有一组函数可供选择?

如果这是一个愚蠢的问题,请原谅我 - 正如我所说的,我不明白vtable是如何运作的,所以我真的不知道更好.

编辑

所以,如果我有一个带有两个单独子类的抽象类:

    A
   / \
  /   \
 B     C
Run Code Online (Sandbox Code Playgroud)

从子类调用函数时,没有性能损失,比如说,只有一个继承自由类?

Mar*_*k B 5

在子类中调用非虚函数没有任何意义.如果您在示例中调用纯虚函数的重写版本,则虚拟惩罚可能仍然存在.通常,编译器很难优化虚拟表的使用,除非在非常特定的情况下,它知道相关对象的确切的按值类型(来自上下文).

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

  • 我已经通过实验测量了虚拟函数调用的开销,比直接函数调用(在3GHz处理器上)高约7纳秒.这是否会增加某些重要因素取决于您正在做什么. (2认同)