_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ルックアップを行う必要がありますか、それともfinal
とマークされているのでB::f()
を直接呼び出すことができますか?
FinalはC++の最適化に使用されますか?
それは可能です。
前述のように、すでに使用されています。 こちらを参照 および ここfinal
の有無にかかわらず、オーバーライド用に生成されたコードを表示します。
これらの行に沿った最適化 は、仮想コールの「仮想化解除」に関連します。これは、クラスまたはメソッドのfinal
によって常にすぐに影響を受けるわけではありません。彼らはこれを決定する助けを提供しますが、仮想関数とクラス階層の通常のルールが適用されます。
コンパイラは、実行時に特定のメソッドが常に呼び出されることを決定できる場合(たとえば、自動オブジェクトを使用したOPの例で)、メソッドがfinal
であるかどうかにかかわらず、 とにかく最適化 を適用できますか否か。
最適化は as-ifルール に該当します。これにより、観察可能な動作が-元のコードが実行された場合。