final 用于 C++ 中的优化吗?

Is final used for optimization in C++?

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-table 查找,还是可以直接调用 B::f() 因为它被标记为 final ]?

Is final used for optimization in C++?

可以,而且确实如此。

如前所述,它已经在使用中; see here and here 显示使用和不使用 final 的覆盖生成的代码。

将与虚拟调用的 "de-virtualization" 相关。这并不总是立即受到 class nor 方法的 final 的影响。尽管他们提供帮助来确定这一点,但适用虚函数和 class 层次结构的正常规则。

如果编译器可以确定在运行时将始终调用特定方法(例如,给定 OP 示例,使用自动对象),它可以应用这样 an optimisation anyway,无论该方法是否 final 与否。

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