首頁 > 後端開發 > C++ > C 11 中的「extern template」如何避免冗餘範本實例化?

C 11 中的「extern template」如何避免冗餘範本實例化?

DDD
發布: 2024-12-20 14:59:13
原創
276 人瀏覽過

How Can `extern template` in C  11 Avoid Redundant Template Instantiations?

避免使用extern 模板進行模板實例化(C 11)

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;在source1.cpp中,確保它在專案中只會實例化一次。

重要注意事項

extern模板的使用應僅限於以下情況知道該模板將在其他地方實例化。如果沒有實例化,程式將導致無法解析的參考。作為最佳實踐,建議在單一頭文件中聲明所有模板實例化,避免因不同文件中的多個實例化而導致的潛在問題。

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板