2

関数テンプレートは、関数を移植可能にし、任意のデータ型で使用できるようにするために使用されることを知っています。

また、特定のデータ型のより効率的な実装がある場合は、テンプレートの明示的な特殊化が行われます。

しかし、明示的な特殊化の代わりに、から呼び出すことができる非テンプレート関数をコーディングすることもできますmain。これにより、コンパイラは非テンプレート関数を明示的に特殊化されたテンプレート化関数よりも速く見つけることができるため、処理時間を節約できます。これにより、効率が向上します。

では、非テンプレート関数を呼び出すだけの代替手段があるのに、なぜ明示的な特殊化を使用するのでしょうか?

間違っていたら訂正してください!

編集 1: 教授から、関数テンプレートを作成して関数を呼び出すときはいつでもmain、コンパイラは最初にテンプレート化された関数を探し、それを見つけることができない場合は関数テンプレートを検索し、そこから順番に関数テンプレートを検索すると言われました。テンプレート化された関数を作成し、それを呼び出します。

4

3 に答える 3

4

これにより、コンパイラはグローバル関数を明示的に特殊化されたテンプレート化された関数よりも高速に見つけることができるため、処理時間を節約できます。これにより、効率が向上します。

コンパイラが非テンプレート関数を関数テンプレートの特殊化よりも速く見つけるのはなぜですか? このステートメントを検証するために、コンパイラのパフォーマンスをベンチマークしましたか? という名前の関数を使用する場合f、コンパイラは常に一連の候補関数をコンパイルし、オーバーロードの解決を実行して、使用する正しい関数を決定する必要があります。

実行時 (これはパフォーマンスが本当に重要なときですよね?) 関数テンプレートのインスタンス化を呼び出すパフォーマンスは、非テンプレート関数を呼び出すパフォーマンスよりも優れているべきではありません。

では、グローバル関数を呼び出すだけの代替手段があるのに、なぜ明示的な特殊化を使用するのでしょうか?

通常、関数テンプレートの場合、明示的な特殊化は使用しません。これは、通常、混乱を招き、困難になるためです。ISO C++ 標準には、関数テンプレートを特殊化するときは非常に慎重になるという詩的な警告があります。Herb Sutter の"Why Not Specialize Function Templates?"を読むことができます。問題の適切な説明と、関数テンプレートを特化したくない理由については、 を参照してください。

于 2010-10-08T06:23:39.393 に答える
1

均一性の理由から。API を使用する人は、特定の引数を使用してメソッドを呼び出すだけで、一般的な関数を取得するものもあれば、明示的に特殊化された関数を取得するものもあります。クライアントは、使用するものを知る必要も気にする必要もありません。

于 2010-10-08T06:09:26.583 に答える
1

コンパイル時の効率と実行時の効率を混同しているようです。呼び出す関数の選択は、実行時ではなくコンパイル時に行われるため、プログラムの実行時に違いはありません。

明示的な特殊化は、特別な扱いの恩恵を受けることができる特別なケースがある場合に使用されます。の場合のように、これが裏目に出る場合std::vector<bool>もあれば、非常に便利な場合もあります。これは、関数のユーザーが特別なケースがあることを認識する必要がないことを意味します。ただ透明です。

于 2010-10-08T21:17:53.483 に答える