最终用于C++中的优化?

tml*_*len 39 c++ virtual final c++11

class A {
public:
    virtual void f() = 0;
};

class B : public A {
public:
    void f() final override { };
};

int main() {
    B* b = new B();
    b->f();
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,编译器是否仍需要执行v表查找b->f();,或者是否可以B::f()直接调用,因为它已被标记final

Nia*_*all 37

最终用于C++中的优化?

它可以是,而且是.

如上所述,它已被使用; 请参阅此处此处显示生成的代码,包括和不使用final.

沿着这些线的优化将涉及虚拟呼叫的"去虚拟化".这并不总是立即受到final类和方法的影响.尽管他们提供了帮助来确定这一点,但虚拟函数和类层次结构的常规规则也适用.

如果编译器可以确定在运行时始终会调用特定方法(例如,给定OP示例,使用自动对象),无论方法是否适用,它都可以应用这样的优化final.

优化属于as-if规则,允许编译器应用任何转换,只要可观察行为与原始代码的执行完全相同.

  • @JohanLundberg:使用[Compiler Explorer](https://godbolt.org/g/f02eYq)进行快速实验,并在本地显示至少gcc 6.1,clang 3.8和MSVC++ 2015U2使用`final`关键字进行虚拟化. (4认同)
  • @JohanJundberg有一个非常好的博客,其中一位gcc开发人员关于虚拟化:http://hubicka.blogspot.de/2014/01/devirtualization-in-c-part-1.html.它还包含一个解释,当final有帮助时,gcc引入了一个警告,说明添加`final`将启用无法完成的优化. (4认同)
  • 对于任何好奇的人,我认为这是当前优化在clang中的地方:[CodeGenFunction :: CanDevirtualizeMemberFunctionCall](https://github.com/llvm-mirror/clang/blob/0e2d28ae3ba7407eb4c0b777f63e237013608261/lib/CodeGen/CGClass.cpp#L2676) (2认同)