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

「extern template」は C での冗長なテンプレートのインスタンス化をどのように防ぐことができますか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-20 20:42:09515ブラウズ

How Can `extern template` Prevent Redundant Template Instantiation in C  ?

extern テンプレートを使用してテンプレートのインスタンス化を回避する

テンプレートのインスタンス化は C プログラミングの重要なステップであり、コンパイル時に特定のテンプレート インスタンスが作成されます。 。特定のシナリオでは、コンパイル時間を最適化し、冗長な定義を回避するために、テンプレートのインスタンス化を制御することが必要になります。ここで、extern template キーワードが登場します。

関数テンプレートの Extern テンプレート

関数テンプレートとともに使用すると、extern テンプレートは、指定された関数をインスタンス化しないようにコンパイラーに指示します。現在の翻訳単位内のテンプレート。これは、そのテンプレートのインスタンス化がプログラム内の他の場所で見つかることを示します。これは、複数のソース ファイルが同一のパラメータで同じテンプレートをインスタンス化し、コンパイラが複数の定義を破棄する必要があるシナリオで特に役立ちます。

例:

次のコード スニペット:

// header.h
template <typename T>
void f() { /* Body */}

// source1.cpp
#include "header.h"
void something1() { f<int>(); }

// source2.cpp
#include "header.h"
extern template void f<int>();
void something2() { f<int>(); }

この場合、source2.cpp の extern テンプレートはコンパイラーに次のことを通知します。 fテンプレートのインスタンス化は他の場所から取得する必要があります。これにより、コンパイラが冗長なインスタンス化を生成し、後でリンク中に破棄することを防ぎます。

クラス テンプレートの Extern テンプレート

関数テンプレートと同様に、extern テンプレートも使用できます。クラステンプレートを使用します。これは、同じパラメータを持つテンプレート クラスの複数のインスタンス化を避けるために行われます。

例:

// header.h
template <typename T>
class MyClass { /* Body */}

// source1.cpp
#include "header.h"
MyClass<int> obj1;

// source2.cpp
#include "header.h"
extern template class MyClass<int>;
MyClass<int> obj2;

ここでは、source2.cpp の extern テンプレートにより、 MyClassテンプレート クラスは 1 回だけインスタンス化され、冗長な定義を防ぎます。

extern テンプレートの使用に関するガイドライン

  • extern テンプレートは、テンプレートはプログラム内の他の場所に存在します。
  • この手法は、関数テンプレート、クラス テンプレート、さらにはテンプレート メンバーにも適用できます。
  • 一般的に、競合の可能性を避けるために、すべてのテンプレート定義とインスタンス化を 1 つのヘッダー ファイル内に保持することをお勧めします。
  • テンプレート定義を一元化できない場合は、すべての関数で extern テンプレートを使用してください。ただし、テンプレートが使用されるソース ファイルは 1 つです。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。