extern テンプレートは、開発者が特定のコンパイル単位でのテンプレートのインスタンス化を防止できる強力な C 11 キーワードです。 。これは、複数のソース ファイルが異なるパラメータで同じテンプレートをインスタンス化し、コードの重複やコンパイル時間の増加につながる可能性がある大規模なコードベースを操作する場合に特に役立ちます。
の場合関数テンプレートの場合、extern テンプレートを使用すると、関数が別の場所でインスタンス化されることがわかっている場合に、コンパイラに特定のテンプレートをインスタンス化しないように強制できます。次の例を考えてみましょう。
// header.h template<typename T> void ReallyBigFunction() { // Body }
// source1.cpp #include "header.h" void something1() { ReallyBigFunction<int>(); }
// source2.cpp #include "header.h" extern template void ReallyBigFunction<int>(); void something2() { ReallyBigFunction<int>(); }
extern テンプレートがないと、コンパイラは ReallyBigFunction
source1.o void something1() void ReallyBigFunction<int>() // Compiled first time source2.o void something2() void ReallyBigFunction<int>() // Compiled second time
これらのファイルをリンクすると、ReallyBigFunction
この問題を回避するには、source2.cpp で extern テンプレートを使用できます。
// source2.cpp #include "header.h" extern template void ReallyBigFunction<int>(); void something2() { ReallyBigFunction<int>(); }
これにより、次のオブジェクト ファイルが作成されます。
source1.o void something1() void ReallyBigFunction<int>() // Compiled just one time source2.o void something2() // No ReallyBigFunction<int> here because of the extern
これらのオブジェクト ファイルがリンクされると、2 番目のオブジェクト ファイルは最初のオブジェクト ファイルのシンボルを使用するため、コードの重複が回避され、コンパイルが削減されます。 time.
extern テンプレートをクラス テンプレートとともに使用して、特定のクラス メンバーのインスタンス化を防ぐこともできます。例:
// header.h template<typename T> class Foo { public: T f(); };
// source1.cpp #include "header.h" Foo<int> foo1;
// source2.cpp #include "header.h" extern template class Foo<int>; Foo<int> foo2;
extern テンプレートがないと、コンパイラは Foo
extern テンプレートは、C 11 プロジェクトでコードの重複を回避し、コンパイル時間を短縮するための貴重なツールです。 extern テンプレートを選択的に使用して不必要なテンプレートのインスタンス化を防ぐことで、開発者はコードのパフォーマンスを最適化できます。
以上がC 11 の「extern template」は、テンプレートの重複インスタンス化を防ぎ、コンパイル時間を短縮するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。