2013-07-31 47 views
2

我試圖限制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不是?

+0

在包括VS 2017的Visual Studio編譯器中,STL實現仍然會發生同樣的問題。在Visual Studio中無法使用STL類的extern模板。 – 0kcats

+0

模板應該在頭文件中實現,但是,爲了使extern模板有任何效果,需要將方法定義移到類體外(通常位於類的主體後面的相同頭文件中)。 – 0kcats

回答

-2

標準STL數據結構是在頭文件中實現的,所以這不是VS10特有的。你爲什麼只想限制一個目標文件?

在頭文件和源文件之間分割模板時出現問題 - 您可以搜索它。

+0

我想改善我們的編譯和鏈接時間。 –

+0

使用預編譯頭文件並將STL頭文件放在那裏。 –

+0

我已經做了,但那不是重點。 –