虚拟继承对性能的影响

Gra*_*eme 26 c++ performance real-time virtual-inheritance

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

sbi*_*sbi 27

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

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

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

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

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

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


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

  • @sbi:如果函数不是虚函数,则可以静态选择要调用的函数,但是必须在运行时计算[或查询]指针,对吗? (2认同)