Extern テンプレートを使用してテンプレートのインスタンス化を最適化する
C 11 では、extern テンプレートは、冗長なインスタンス化を回避するために使用できる強力なキーワードです。テンプレート、特に複数の翻訳単位 (.cpp ファイルなど) に同じヘッダー ファイルが含まれる可能性がある場合テンプレート定義。
Extern Template の概念
Extern テンプレートは基本的に、たとえそれが付属のヘッダー。これは、テンプレートが同じプロジェクトの別の翻訳単位でインスタンス化されることがわかっている場合に便利です。
関数テンプレートの使用法
関数テンプレートの場合、externテンプレート宣言は次のように使用できます:
#include "header.h" extern template void f<T>(); // Avoid instantiation in this translation unit
これは、f テンプレートがプロジェクト内の別の場所で定義されることを示します。現在のファイルではインスタンス化されません。
クラス テンプレートの使用法
同様に、クラス テンプレートの場合、extern テンプレート宣言は次の形式になります。
#include "header.h" extern template class foo<int>; // Avoid instantiation in this translation unit
これにより、この特定の変換では foo テンプレート クラスがインスタンス化されなくなります。
最適化アプリケーション
次のシナリオを考えます:
// header.h template<typename T> void f();
// source1.cpp #include "header.h" void f<int>();
// source2.cpp #include "header.h" void f<string>();
extern テンプレートなし、両方の source1.cppそして、source2.cpp は f テンプレートをインスタンス化するため、複数の定義が発生し、コンパイル時間が無駄になります。ファイルの 1 つで extern テンプレートを使用することで、この冗長性を回避します。
// source1.cpp #include "header.h" void f<int>();
// source2.cpp #include "header.h" extern template void f<int>(); void f<string>();
重要なポイント
以上がExtern テンプレートは C でのテンプレートのインスタンス化をどのように最適化できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。