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

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

Barbara Streisand
Barbara Streisand原創
2024-12-14 12:50:12681瀏覽

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

使用extern 範本避免範本實例化(C 11)

在物件導向程式設計中,範本在提供通用解決方案方面發揮著至關重要的作用可以處理不同的資料類型。但是,當多個原始檔案使用相同的參數實例化模板時,可能會導致多個定義並增加編譯時間。

extern template 關鍵字可用來解決此問題並避免不必要的範本實例化。它指示編譯器不要在目前翻譯單元內實例化特定的模板專門化。相反,編譯器依賴在另一個原始檔案或連結庫中實例化的模板。

函數範本

處理函數範本時,可以使用 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 中的實例化。在source2.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 template 有助於消除這個問題。 一致的程式碼:透過確保範本僅實例化一次,可以提高一致性並降低錯誤風險。 結論extern template 是一個強大的關鍵字,可以讓開發者控制模板實例化並優化編譯時間。透過明智地使用它,開發人員可以確保有效地使用模板並避免多次實例化的陷阱,從而實現更快的編譯和更小的可執行檔。

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

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