私は、メンバ関数を呼び出す必要があります(継承は物事を簡単にするためにほとんどの場所で使用されています)が、パフォーマンスで非バーチャルディスパッチを使用して強制的に呼び出したいそのような場所では、正確な型はコンパイル時に知られています。私はパフォーマンス上の理由から、仮想コールのパフォーマンスが悪いプラットフォームでこれを行います。ほとんどの機能では、仮想関数のオーバーヘッドは問題ありませんが、いくつかの点ではそうではありません。私は仮想と非仮想の両方としてすべての機能を複製しないようにしたいと思います。テンプレート内で非仮想ディスパッチを使用する
例:
template <typename Derived>
class Base {
public:
virtual ~Base() {}
void foo() { Derived::func_in_derived(); }
};
class Derived : public Base<Derived> {
public:
void func_in_derived() {}
};
コンパイラはこのようなケースを検出し、自動的に静的ディスパッチを使用する必要があります。 –
@dark_charlie:もっとも簡単な場合のみです。複雑ではないケースは、リンク時やその他のグローバル最適化手法でカバーする必要があります。これは、コンパイラではあまり普及していないか、非常に若いです。ポインタ/参照を予測することが難しい仮想関数を呼び出す場合コンパイラは静的ディスパッチを行います。 –
非実装の 'Implementation :: DoImpl()'に関して 'Implementation :: Do()'を実装して、パフォーマンス重視の場所で後者を呼び出すことができます。 –