ホームページ > バックエンド開発 > C++ > Extern テンプレートは C でのテンプレートのインスタンス化をどのように最適化できますか?

Extern テンプレートは C でのテンプレートのインスタンス化をどのように最適化できますか?

Patricia Arquette
リリース: 2024-12-12 21:52:14
オリジナル
177 人が閲覧しました

How Can Extern Templates Optimize Template Instantiation in C  ?

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 テンプレートを使用します。テンプレートはプロジェクト内の別の場所でインスタンス化されることが確実です。
  • これは関数テンプレートとクラスの両方に適用されます
  • extern テンプレートを使用すると、特に大規模なテンプレートや頻繁に使用されるテンプレートを操作する場合に、コンパイル時間を大幅に短縮し、オブジェクト ファイル サイズを最適化できます。

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

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