質問

そんなこと知ってる 関数テンプレート 機能をポータブルにするように使用され、任意のデータ型で使用できるようにします。

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

しかし、その代わりに 明示的な専門化 コーディングすることもできます ノントンプレート関数 それを呼び出すことができます main 。これにより、コンパイラが見つけると処理時間を節約できます nontemplate関数 より速い 明示的に専門化されたテンプレート関数 これは、効率性の点で優れています。

なぜ私たちは使用するのですか 明示的な専門化 呼び出すだけの代替手段があるとき nontemplate関数?

私が間違っている場合は私を修正してください!

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

役に立ちましたか?

解決

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

特別な治療の恩恵を受けることができる特別なケースがある場合、明示的な専門化が使用されます。の場合のように、これは時々バックファイアをします std::vector<bool>, 、それ以外の場合は非常に便利です。これは、関数のユーザーが特別なケースがあることに注意する必要がないことを意味します。それはただ透明です。

他のヒント

これにより、コンパイラは明示的に特殊なテンプレート機能よりも速くグローバル機能を見つけ、効率の面でより良いものになるため、処理時間を節約できます。

コンパイラは、関数テンプレートの専門化よりも速い非画数関数を見つけるのはなぜですか?このステートメントを確認するために、コンパイラパフォーマンスをベンチマークしましたか?名前付き関数を使用する場合 f, 、コンパイラは常に一連の候補関数をコンパイルし、過負荷解像度を実行して、使用する正しい関数を決定する必要があります。

実行時(パフォーマンスが実際に重要な場合ですよね?)関数テンプレートのインスタンス化を呼び出すパフォーマンスは、非画数関数を呼び出すことのパフォーマンスよりも優れているはずです。

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

一般的なケースでは、関数テンプレートの場合、通常は混乱して困難であるため、明示的な専門化を使用しません。 ISO C ++標準には、機能テンプレートを専門とする場合、非常に慎重になるという詩的な警告があります。ハーブサッターを読むことができます 「機能テンプレートを専門化してみませんか?」 問題の適切な説明と、機能テンプレートを専門化したくない理由。

均一性の理由から。 APIを使用している人は、特定の引数を持つメソッドを呼び出すだけで、一部は一般的な関数を取得します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top