C++中final是用来优化的吗?

问题描述 投票:0回答:1
class A {
public:
    virtual void f() = 0;
};

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

int main() {
    B* b = new B();
    b->f();
}

在这种情况下,编译器是否仍然需要对

b->f();
进行v表查找,或者是否可以直接调用
B::f()
,因为它被标记为
final

c++ c++11 compiler-optimization virtual final
1个回答
51
投票

C++中final是用来优化的吗?

可以,而且确实如此。

如前所述,它已经被使用; 参见此处此处显示了使用和不使用

final
的覆盖的生成代码。

沿着这些路线的优化将与虚拟调用的“去虚拟化”相关。这并不总是立即受到类或方法的

final
的影响。尽管它们提供了确定这一点的帮助,但虚拟函数和类层次结构的正常规则仍然适用。

如果编译器可以确定在运行时始终会调用特定方法(例如,给定带有自动对象的 OP 示例),则无论该方法是否为 final,它都可以应用此类

优化
.

优化属于 as-if 规则,该规则允许编译器应用任何转换,只要可观察的行为就像原始代码已被执行一样。

© www.soinside.com 2019 - 2024. All rights reserved.