虚拟继承对性能的影响

时间:2011-02-04 15:24:42

标签: c++ performance real-time virtual-inheritance

我正在考虑在实时应用程序中使用虚拟继承。使用虚拟继承是否会产生类似于调用虚函数的性能影响?有问题的对象只会在启动时创建,但是我担心层次结构中的所有函数是否都会通过vtable调度,或者只是来自虚拟基类的函数。

4 个答案:

答案 0 :(得分:25)

通用实现将允许访问虚拟基类的 数据成员 使用额外的间接。

正如James在他的评论中指出的那样,在多继承场景中调用基类的成员函数需要调整this指针,如果该基类是虚拟的,则基数的偏移量派生类对象中的class子对象取决于派生类的动态类型,需要在运行时计算。

这是否会对实际应用程序产生明显的性能影响取决于很多方面:

  • 虚拟基地 是否拥有数据成员 ?通常,它是需要从虚拟派生的抽象基类,而具有任何数据成员的抽象基础通常都是代码味道。

  • 假设您拥有包含数据成员的虚拟基础,那些访问 的关键路径 ?如果用户点击GUI中的某个按钮会导致几十个额外的间接,那么没有人会注意到。

  • 如果避免虚拟基地,那么 替代 会是什么?设计不仅可能低劣,而且替代设计也可能具有性能影响。毕竟,它必须达到和TANSTAAFL一样的目标。然后你换了另一个性能损失加上劣质设计。


补充说明:看看Stan Lippmann的 Inside the C++ Object Model ,它可以非常彻底地回答这些问题。

答案 1 :(得分:3)

看看以下大型实验研究发表的OOPSLA'96。我复制粘贴一个bibtex条目,摘要和文章的链接。我认为这是迄今为止关于该主题的最全面的实验研究。

@article{driesen1996direct,
  title={{The direct cost of virtual function calls in C++}},
  author={Driesen, K. and H{\\"o}lzle, U.},
  journal={ACM Sigplan Notices},
  volume={31},
  number={10},
  pages={306--323},
  issn={0362-1340},
  year={1996},
  publisher={ACM}
}

<强>摘要: 我们研究虚函数的直接成本 在C ++程序中调用,假定标准 使用虚函数表实现。我们 通过实验测量这个开销的一些 大型基准程序,结合使用 可执行检查和处理器模拟。我们的 结果表明,测量的C ++程序花了一个 他们的时间中位数为5.2%,他们的时间占3.7% 发货代码中的说明。对于“所有虚拟” 程序的版本,中位数开销上升到 13.7%(指示的13%)。 “thunk”变种 虚函数表实现的减少 开销相对于中位数为21% 标准实施。在未来的处理器上,这些 间接费用可能适度增加

http://www.cs.ucsb.edu/~urs/oocsb/papers/oopsla96.pdf

答案 2 :(得分:0)

您确定您的意思是虚拟继承吗?如果是这样,它与正常虚函数调用的成本相同。 vtable链式搜索仅遵循指定的路径。

你说这是在启动时。您的磁盘开销(从简单地将代码加载到内存中)可能需要比半打指令大几个数量级的时间来进行vtable查找。如果您可以对此进行分析并发现差异,我会感到有些惊讶。

答案 3 :(得分:0)

在不检查编译或运行时细节的情况下,基于我使用 GNU C++17 的测试,访问虚拟基类中的数据成员没有性能影响。