3 回答

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超5個(gè)贊
當(dāng)您知道它將在其他地方實(shí)例化時(shí),您應(yīng)該只使用extern template
強(qiáng)制編譯器不實(shí)例化模板。它用于減少編譯時(shí)間和目標(biāo)文件大小。
例如:
// header.htemplate<typename T>void ReallyBigFunction(){ // Body}// source1.cpp#include "header.h"void something1(){ ReallyBigFunction<int>();}// source2.cpp#include "header.h"void something2(){ ReallyBigFunction<int>();}
這將導(dǎo)致以下目標(biāo)文件:
source1.o void something1() void ReallyBigFunction<int>() // Compiled first timesource2.o void something2() void ReallyBigFunction<int>() // Compiled second time
如果兩個(gè)文件都鏈接在一起,void ReallyBigFunction<int>()
則會(huì)丟棄一個(gè)文件,從而導(dǎo)致浪費(fèi)的編譯時(shí)間和目標(biāo)文件大小。
為了不浪費(fèi)編譯時(shí)間和目標(biāo)文件大小,有一個(gè)extern
關(guān)鍵字使編譯器無(wú)法編譯模板函數(shù)。當(dāng)且僅當(dāng)您知道它在其他地方使用相同的二進(jìn)制文件時(shí),您應(yīng)該使用它。
更改source2.cpp
到:
// source2.cpp#include "header.h"extern template void ReallyBigFunction<int>();void something2(){ ReallyBigFunction<int>();}
將導(dǎo)致以下目標(biāo)文件:
source1.o void something1() void ReallyBigFunction<int>() // compiled just one timesource2.o void something2() // No ReallyBigFunction<int> here because of the extern
當(dāng)這兩者都鏈接在一起時(shí),第二個(gè)目標(biāo)文件將只使用第一個(gè)目標(biāo)文件中的符號(hào)。不需要丟棄,也不需要浪費(fèi)編譯時(shí)間和目標(biāo)文件大小。
這應(yīng)該僅在項(xiàng)目中使用,例如在多次使用模板時(shí)vector<int>
,您應(yīng)該extern
在除一個(gè)源文件之外的所有文件中使用。
這也適用于類(lèi)和函數(shù)作為一個(gè),甚至模板成員函數(shù)。

TA貢獻(xiàn)1757條經(jīng)驗(yàn) 獲得超8個(gè)贊
模板的已知問(wèn)題是代碼膨脹,這是在調(diào)用類(lèi)模板特化的每個(gè)模塊中生成類(lèi)定義的結(jié)果。為了防止這種情況,從C ++ 0x開(kāi)始,可以在類(lèi)模板特化之前使用關(guān)鍵字extern
#include <MyClass>
extern template class CMyClass<int>;
模板類(lèi)的顯式實(shí)例應(yīng)僅在單個(gè)轉(zhuǎn)換單元中發(fā)生,最好是具有模板定義的轉(zhuǎn)換單元(MyClass.cpp)
template class CMyClass<int>;template class CMyClass<float>;
- 3 回答
- 0 關(guān)注
- 1292 瀏覽
添加回答
舉報(bào)