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

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

Dec 20, 2024 pm 02:59 PM

How Can `extern template` in C  11 Avoid Redundant Template Instantiations?

extern テンプレートによるテンプレートのインスタンス化の回避 (C 11)

C 11 の extern template キーワードは、不必要なテンプレートのインスタンス化を防止するメカニズムを提供し、コンパイル時間とオブジェクト ファイルを削減します。サイズ。特定のシナリオでは、テンプレートが別の場所でインスタンス化されることを認識し、このキーワードを使用してコンパイラにインスタンス化を実行しないように指示すると有益です。

関数テンプレートの使用法

質問に示されている例とは異なり、extern template キーワードは関数テンプレートにも使用できます。次の例を考えてみましょう。

// header.h
template<typename T>
void bigFunc();

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

// source2.cpp
#include "header.h"
extern template void bigFunc<int>(); // This prevents its compilation in source2.cpp
void something2() {
    bigFunc<int>();
}
ログイン後にコピー

extern テンプレート ステートメントがないと、bigFunc はsource1.cpp とsource2.cpp の両方でコンパイルされ、オブジェクト コードが冗長になります。 extern テンプレートを使用すると、コンパイラは、source2.cpp で bigFunc をインスタンス化しないように指示され、コンパイル時間とオブジェクト ファイル サイズが削減されます。

クラス テンプレートの使用法

質問の図 2 に示されているように、extern テンプレートはクラスにも使用できますtemplates:

// header.h
template<typename T>
class myClass {
    T getValue();
};

// source1.cpp
#include "header.h"
extern template class myClass<int>; // Prevent instantiation here
void something1() {
    myClass<int> obj;
    obj.getValue();
}
ログイン後にコピー

このシナリオでは、コンパイラーは myClass をインスタンス化しないように指示されます。 source1.cpp では、プロジェクト内で 1 回だけインスタンス化されるようにします。

重要な考慮事項

extern テンプレートの使用は、次のような状況に限定する必要があります。テンプレートが別の場所でインスタンス化されることがわかっています。インスタンス化されていない場合、プログラムは未解決の参照を生成します。ベスト プラクティスとして、すべてのテンプレートのインスタンス化を 1 つのヘッダー ファイルで宣言し、異なるファイルでの複数のインスタンス化によって引き起こされる潜在的な問題を回避することをお勧めします。

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

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

C言語関数によって返される値の種類は何ですか?返品値を決定するものは何ですか? C言語関数によって返される値の種類は何ですか?返品値を決定するものは何ですか? Mar 03, 2025 pm 05:52 PM

C言語関数によって返される値の種類は何ですか?返品値を決定するものは何ですか?

GULC:Cライブラリはゼロから構築されています GULC:Cライブラリはゼロから構築されています Mar 03, 2025 pm 05:46 PM

GULC:Cライブラリはゼロから構築されています

c言語関数形式文字ケース変換手順 c言語関数形式文字ケース変換手順 Mar 03, 2025 pm 05:53 PM

c言語関数形式文字ケース変換手順

C言語関数の定義と呼び出しルールは何ですか、そして C言語関数の定義と呼び出しルールは何ですか、そして Mar 03, 2025 pm 05:53 PM

C言語関数の定義と呼び出しルールは何ですか、そして

メモリに保存されているC言語関数の返品値はどこにありますか? メモリに保存されているC言語関数の返品値はどこにありますか? Mar 03, 2025 pm 05:51 PM

メモリに保存されているC言語関数の返品値はどこにありますか?

明確な使用法とフレーズ共有 明確な使用法とフレーズ共有 Mar 03, 2025 pm 05:51 PM

明確な使用法とフレーズ共有

STL(ソート、検索、変換など)のアルゴリズムを効率的に使用するにはどうすればよいですか? STL(ソート、検索、変換など)のアルゴリズムを効率的に使用するにはどうすればよいですか? Mar 12, 2025 pm 04:52 PM

STL(ソート、検索、変換など)のアルゴリズムを効率的に使用するにはどうすればよいですか?

C標準テンプレートライブラリ(STL)はどのように機能しますか? C標準テンプレートライブラリ(STL)はどのように機能しますか? Mar 12, 2025 pm 04:50 PM

C標準テンプレートライブラリ(STL)はどのように機能しますか?

See all articles