我試圖限制std :: map,std :: multimap和std :: vector的某些模板實例化爲只有一個對象文件,以提高編譯和鏈接時間。據我瞭解,之所以說我不能簡單地用使用STL類的extern模板類
#include <vector>
extern template class std::vector<int>;
std::vector<int> myobj;
是VS10的報頭包含所有成員的定義,所以它們是由編譯器處理爲內聯,並反正實例化。我的假設是正確的,如果我要從標題中刪除所有函數體,它會起作用嗎?如果是這樣,是否有人碰巧已經擁有這樣的標題,並且能夠分享它?
我也試着列出一些成員,像這樣
extern template std::vector<int>::vector(); // works
extern template std::vector<int>::~vector(); // no effect
並且在構造函數被移除,析構函數是根據dumpbin
仍然定義。這是什麼原因?是否因爲某些原因,dtor被認爲是內聯的,而ctor不是?
在包括VS 2017的Visual Studio編譯器中,STL實現仍然會發生同樣的問題。在Visual Studio中無法使用STL類的extern模板。 – 0kcats
模板應該在頭文件中實現,但是,爲了使extern模板有任何效果,需要將方法定義移到類體外(通常位於類的主體後面的相同頭文件中)。 – 0kcats