ホームページ > バックエンド開発 > C++ > 「extern template」は C での冗長なテンプレートのインスタンス化をどのように回避しますか?

「extern template」は C での冗長なテンプレートのインスタンス化をどのように回避しますか?

Barbara Streisand
リリース: 2024-12-14 12:50:12
オリジナル
681 人が閲覧しました

How Does `extern template` Avoid Redundant Template Instantiation in C  ?

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 を明示的にインスタンス化します。一方、source2.cpp は不要なインスタンス化を防ぐために extern テンプレートを使用します。 f の場合、コンパイラは、source1.cpp からのインスタンス化を使用します。

クラス テンプレート

同じ原則がクラス テンプレートにも適用されます。 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 の明示的なインスタンス化が防止され、source1.cpp からのインスタンス化が代わりに使用されることが保証されます。

extern テンプレートを使用する利点

extern テンプレートを使用すると、次のようなメリットが得られます利点:

  • コンパイル時間の短縮: 不必要なテンプレートのインスタンス化を回避することで、コンパイル時間を大幅に短縮できます。
  • オブジェクト ファイルのサイズの縮小:同じテンプレートを複数インスタンス化すると、オブジェクト ファイルが大きくなります。 extern テンプレートは、この問題の解決に役立ちます。
  • 一貫したコード: テンプレートが 1 回だけインスタンス化されるようにすることで、一貫性が促進され、エラーのリスクが軽減されます。

結論

extern テンプレートは、開発者がテンプレートを制御できるようにする強力なキーワードですインスタンス化とコンパイル時間の最適化。これを賢明に使用することで、開発者はテンプレートが効率的に使用され、複数のインスタンス化の落とし穴を回避できるようになり、その結果、コンパイルが高速化され、実行可能ファイルが小さくなります。

以上が「extern template」は C での冗長なテンプレートのインスタンス化をどのように回避しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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