【问题标题】:C++: Devirtualize Leaf ClassesC++:去虚拟化叶类
【发布时间】:2013-05-09 14:15:35
【问题描述】:

在 Java、C# 和 D 等语言中,finalsealed 类保证是叶类(其他类不能继承的类)。这允许编译器对编译时类型为finalsealed 的对象进行顶级去虚拟化方法调用。

C++ 没有 finalsealed 关键字。有没有什么方法可以模拟它在我的继承层次结构中的叶子类的去虚拟化方面的行为?

【问题讨论】:

    标签: c++ performance oop virtual-functions


    【解决方案1】:

    C++11 确实有final,尽管它是一个特殊标识符,而不是关键字。它不服务于“去虚拟化”目的。它只是防止从派生类派生或在派生类中覆盖单个方法。

    【讨论】:

    • 当然,标准不会说任何关于去虚拟化的内容,因为 vtables 甚至不是标准的一部分,但是任何体面的优化器都应该这样做。
    • 顺便说一句,我刚刚通过阅读反汇编确认 Clang 在使用 final 时确实对调用进行了去虚拟化。
    • @dsimcha 完全正确,编译器只需要遵循“as-if”规则。
    • 我的观点是,在任何合理的实现中,final 将用于去虚拟化目的,即使技术上标准不需要它。
    • @dsimcha 是的,我明白你的意思,我同意。 final 为编译器提供更多信息以进行这些优化。
    【解决方案2】:

    在 C++ 中这样做的唯一方法是确保编译器知道静态和动态类型是相同的,并让优化器意识到不需要虚拟调用。换句话说,按值访问对象,而不是通过引用或指针。这甚至适用于 叶子类型!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-06
      相关资源
      最近更新 更多