extern テンプレートを使用してテンプレートのインスタンス化を回避する (C 11)
オブジェクト指向プログラミングでは、テンプレートは汎用ソリューションを提供する上で重要な役割を果たします。さまざまなデータ型を処理します。ただし、複数のソース ファイルが同じパラメータでテンプレートをインスタンス化すると、複数の定義が発生し、コンパイル時間が長くなる可能性があります。
extern テンプレート キーワードを使用すると、この問題に対処し、不必要なテンプレートのインスタンス化を回避できます。これは、現在の翻訳単位内で特定のテンプレート特殊化をインスタンス化しないようにコンパイラーに指示します。代わりに、コンパイラは、別のソース ファイルまたはリンクされたライブラリでインスタンス化されるテンプレートに依存します。
関数テンプレート
関数テンプレートを扱う場合、extern テンプレートを使用して明示的なテンプレートのインスタンス化を強制的に除外します。たとえば、次のコード スニペットを考えてみましょう。
// header.h template<typename T> void f(); // source1.cpp #include "header.h" void f<int>(); // Explicit instantiation // source2.cpp #include "header.h" extern template void f<int>(); // Prevents explicit instantiation void g() { f<int>(); }
このシナリオでは、source1.cpp は f
クラス テンプレート
同じ原則がクラス テンプレートにも適用されます。 extern テンプレートを使用すると、同じパラメータを持つ同じテンプレート クラスの複数のインスタンス化を回避できます。次の例を考えてみましょう:
// header.h template<typename T> class foo { public: void f(); }; // source1.cpp #include "header.h" template class foo<int>; // Explicit instantiation // source2.cpp #include "header.h" extern template class foo<int>; // Prevents explicit instantiation void h() { foo<int> obj; }
ここでは、source2.cpp の extern テンプレートにより foo
extern テンプレートを使用する利点
extern テンプレートを使用すると、次のようなメリットが得られます利点:
結論
extern テンプレートは、開発者がテンプレートを制御できるようにする強力なキーワードですインスタンス化とコンパイル時間の最適化。これを賢明に使用することで、開発者はテンプレートが効率的に使用され、複数のインスタンス化の落とし穴を回避できるようになり、その結果、コンパイルが高速化され、実行可能ファイルが小さくなります。
以上が「extern template」は C での冗長なテンプレートのインスタンス化をどのように回避しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。