【问题标题】:Does virtual inheritance have a cost when it isn't really needed or used?当虚拟继承不是真正需要或使用时,它是否有成本?
【发布时间】:2017-01-03 08:25:43
【问题描述】:

如果我执行以下操作:

class Derived : public virtual Base {};

但是Base 永远不会在同一个后代类中出现两次,还有成本吗?换句话说,简单地添加关键字是否会为BaseDerived 的子类之间的任何虚函数调用引入额外的间接级别?还是从触发它的后代类的角度来看,Base 的出现两次或更多次?

关于这个的措辞有点强硬......我希望我的问题是有道理的。

【问题讨论】:

  • 如果 Base 有字段,每次从 Derived 访问 Base 字段都会产生成本,因为编译器需要从存储在虚拟方法表中的移位索引中找到 Base。从 Derived 到 Base 的每个演员都是这种情况。此外,从 Base 到 Derived 的每次转换都是 dynamic_cast,这比 static_cast 更昂贵。
  • @Franck 即使您直接使用Derived 实例也是如此吗? IE。没有奇怪的钻石继承。
  • 是的,因为 Derived 类无法知道未来的 Derived2 类(在另一个翻译单元中)是否不会创建钻石。在这种情况下,从 Derived* 到 Base* 的转变会有所不同。

标签: c++


【解决方案1】:

如果Derivedfinal,那么编译器可以去虚拟化来自Base 的继承;但是,不能保证它,并且平台 ABI 可能会阻止它这样做。

如果Derived 不是final,编译器必须预计Derived 可能是具有另一个Base 的完整对象的子对象:

class MoreDerived : public virtual Base, public Derived {};

如果编译器可以观察到Derived 永远不会作为子对象出现,那么编译器也可以在链接时优化期间将DerivedBase 的继承去虚拟化;但同样,不能保证它会这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-02
    • 2011-07-30
    • 2012-03-15
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    相关资源
    最近更新 更多