extern 範本是一個強大的C 11 關鍵字,它允許開發人員阻止在特定編譯單元中實例化模板。這在處理大型程式碼庫時特別有用,其中多個原始檔案可能使用不同的參數實例化相同模板,從而導致重複程式碼並增加編譯時間。
在以下情況下函數模板,extern template 可用於強制編譯器在知道該函數將在其他地方實例化時不要實例化特定模板。考慮以下範例:
// header.h template<typename T> void ReallyBigFunction() { // Body }
// source1.cpp #include "header.h" void something1() { ReallyBigFunction<int>(); }
// source2.cpp #include "header.h" extern template void ReallyBigFunction<int>(); void something2() { ReallyBigFunction<int>(); }
如果沒有extern 模板,編譯器會編譯ReallyBigFunction
source1.o void something1() void ReallyBigFunction<int>() // Compiled first time source2.o void something2() void ReallyBigFunction<int>() // Compiled second time
將這些檔案連結在一起將產生IndeedBigFunction
為了避免這個問題,我們可以在 source2.cpp 中使用 extern 範本:
// source2.cpp #include "header.h" extern template void ReallyBigFunction<int>(); void something2() { ReallyBigFunction<int>(); }
這將產生以下目標檔案:
source1.o void something1() void ReallyBigFunction<int>() // Compiled just one time source2.o void something2() // No ReallyBigFunction<int> here because of the extern
連結這些目標檔案時,第二個目標檔案將使用第一個目標檔案中的符號,避免重複程式碼並減少編譯time.
extern 範本也可以與類別範本一起使用,以防止特定類別成員的實例化。例如:
// header.h template<typename T> class Foo { public: T f(); };
// source1.cpp #include "header.h" Foo<int> foo1;
// source2.cpp #include "header.h" extern template class Foo<int>; Foo<int> foo2;
如果沒有extern 模板,編譯器會將成員函數f 編譯為Foo
extern 範本是避免重複程式碼並減少 C 11 專案中編譯時間的寶貴工具。透過選擇性地使用 extern 模板來防止不必要的模板實例化,開發人員可以優化其程式碼的效能。
以上是C 11 中的「extern template」如何防止重複模板實例化並減少編譯時間?的詳細內容。更多資訊請關注PHP中文網其他相關文章!