単純化された汎用アルゴリズム以外に、クラス階層に対するテンプレートの利点はありますか? たとえば、クラス階層よりもテンプレートを使用する方が効率的ですか? テンプレートは金融ツールとしてプログラマーから高く評価されていますが、その理由はよくわかりません。
2 に答える
速度が必要な場合、実行時の動的ポリモーフィズムの代わりにテンプレートを使用し、テンプレートは仮想メソッドのルックアップ オーバーヘッドなしでコンパイル時のポリモーフィズム (コンパイル時に解決) を提供します。
ウィキペディアから:
ポリモーフィズムは、派生オブジェクトをベース オブジェクトのインスタンスとして使用できる一般的な標準プログラミング機能ですが、派生オブジェクトのメソッドが呼び出され、仮想メソッドの呼び出しはすべて、最も派生したクラスの呼び出しになります。この動的なポリモーフィック動作は、(通常) 仮想メソッドを持つクラスの仮想ルックアップ テーブル(実行時に呼び出されるメソッドを識別するために走査されるテーブル) の作成によって取得されます。したがって、ランタイム ポリモーフィズムには必然的に実行オーバーヘッドが伴います (ただし、最新のアーキテクチャではオーバーヘッドは無視できます)。ただし、多くの場合、必要なポリモーフィック動作は不変であり、コンパイル時に決定できます。次に、Curiously Recurring Template Pattern (CRTP)静的ポリモーフィズムを実現するために使用できます。これは、プログラミング コードにおけるポリモーフィズムの模倣ですが、コンパイル時に解決されるため、実行時の仮想テーブル ルックアップが不要になります。
もう 1 つの例は、コンパイル時に計算するテンプレートの機能です。たとえば、よく知られている階乗は、通常このように記述されます。
unsigned int factorial(unsigned int n) {
return (n==0)? 1 : n * factorial(n-1);
}
const int x = factorial(4); // == (4 * 3 * 2 * 1 * 1) == 24
const int y = factorial(0); // == 0! == 1
実行時に計算されます。ただし、テンプレートを使用して記述
template <int N>
struct Factorial {
enum { value = N * Factorial<N - 1>::value };
};
template <>
struct Factorial<0> {
enum { value = 1 };
};
// Factorial<4>::value == 24
// Factorial<0>::value == 1
const int x = Factorial<4>::value; // == 24
const int y = Factorial<0>::value; // == 1
コンパイル時に計算されるため、実行時のオーバーヘッドは発生しません。