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,允许编译器应用任何转换,只要可观察到的行为就像原始代码已被执行一样。
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
的覆盖生成的代码。
final
的影响。尽管他们提供帮助来确定这一点,但适用虚函数和 class 层次结构的正常规则。
如果编译器可以确定在运行时将始终调用特定方法(例如,给定 OP 示例,使用自动对象),它可以应用这样 an optimisation anyway,无论该方法是否 final
与否。
优化属于 as-if rule,允许编译器应用任何转换,只要可观察到的行为就像原始代码已被执行一样。