首頁 >後端開發 >C++ >`extern template` 如何防止 C 中的冗餘模板實例化?

`extern template` 如何防止 C 中的冗餘模板實例化?

Barbara Streisand
Barbara Streisand原創
2024-12-20 20:42:09534瀏覽

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 範本與類別範本。這樣做是為了避免使用相同參數多次實例化模板類別。

範例:

// 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;範本類別僅實例化一次,防止冗餘定義。

使用 extern 範本的指南

  • 僅當您確定該類別的實例化時才使用 extern 範本範本存在於程式的其他地方。
  • 這種技術可以應用於函數模板、類別模板,甚至模板成員
  • 通常建議將所有模板定義和實例化保留在一個頭文件中,以避免潛在的衝突。
  • 如果無法集中範本定義,請在所有範本中使用 extern 範本但有一個使用範本的來源檔案。

以上是`extern template` 如何防止 C 中的冗餘模板實例化?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn