虚拟继承是否有性能影响?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (46)

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

提问于
用户回答回答于

常见的实现将使访问虚拟基类的数据成员使用额外的间接寻址。

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

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

  • 虚拟基地是否有数据成员?通常,它是抽象的基类,需要从虚拟中派生出来,而具有任何数据成员的抽象基类无论如何都往往是代码异味。
  • 假设您拥有数据成员的虚拟基地,那么在关键路径中访问这些虚拟基地?如果用户点击GUI中的某个按钮会导致几十个额外的间接指向,则没有人会注意到。
  • 如果避免虚拟基地,会有什么选择?这种设计不仅可能较差,而且替代设计也可能会对性能产生影响。毕竟,它必须达到和TANSTAAFL相同的目标。然后你交易了另一个表现损失加上一个低劣的设计。
用户回答回答于
@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}
}

所属标签

可能回答问题的人

  • 天使的炫翼

    17 粉丝531 提问9 回答
  • 优惠活动秘书

    0 粉丝2 提问8 回答
  • 最爱开车啦

    8 粉丝503 提问7 回答
  • 富有想象力的人

    3 粉丝0 提问5 回答

扫码关注云+社区

领取腾讯云代金券