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规则,允许编译器应用任何转换,只要可观察行为与原始代码的执行完全相同.
归档时间: |
|
查看次数: |
5833 次 |
最近记录: |