ホームページ > バックエンド開発 > C++ > C 11 の「extern template」は、テンプレートの重複インスタンス化を防ぎ、コンパイル時間を短縮するにはどうすればよいですか?

C 11 の「extern template」は、テンプレートの重複インスタンス化を防ぎ、コンパイル時間を短縮するにはどうすればよいですか?

Patricia Arquette
リリース: 2024-12-12 11:02:09
オリジナル
138 人が閲覧しました

How Can `extern template` in C  11 Prevent Duplicate Template Instantiations and Reduce Compilation Time?

C 11 でのインスタンス化を回避するための extern テンプレートの使用

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.cpp とsource2.cpp の両方で、次のオブジェクト ファイルが作成されます。

source1.o
    void something1()
    void ReallyBigFunction<int>()    // Compiled first time

source2.o
    void something2()
    void ReallyBigFunction<int>()    // Compiled second time
ログイン後にコピー

これらのファイルをリンクすると、ReallyBigFunction のコピーが 1 つ作成されます。破棄され、コンパイル時間とオブジェクト ファイル サイズが無駄になります。

この問題を回避するには、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 のメンバー関数 f をコンパイルします。 source1.cpp とsource2.cpp の両方にあるため、コードが重複します。 extern テンプレートを使用すると、メンバー関数は 1 回だけコンパイルされます。

結論

extern テンプレートは、C 11 プロジェクトでコードの重複を回避し、コンパイル時間を短縮するための貴重なツールです。 extern テンプレートを選択的に使用して不必要なテンプレートのインスタンス化を防ぐことで、開発者はコードのパフォーマンスを最適化できます。

以上がC 11 の「extern template」は、テンプレートの重複インスタンス化を防ぎ、コンパイル時間を短縮するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート