C 11 中的extern 模板關鍵字提供了一種機制來防止不必要的模板實例化,從而減少編譯時間和目標檔案尺寸。在某些情況下,知道模板將在其他地方實例化並使用此關鍵字指示編譯器不要執行實例化是有益的。
與問題中提供的範例相反, 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
extern模板的使用應僅限於以下情況知道該模板將在其他地方實例化。如果沒有實例化,程式將導致無法解析的參考。作為最佳實踐,建議在單一頭文件中聲明所有模板實例化,避免因不同文件中的多個實例化而導致的潛在問題。
以上是C 11 中的「extern template」如何避免冗餘範本實例化?的詳細內容。更多資訊請關注PHP中文網其他相關文章!