2009-01-06 48 views
6

我是C++開發人員並使用Visual Studio 2008. 如何減少* .obj文件大小? 我讀過why are my visual studio .obj files are massive in size compared to the output .exe?,但沒有找到答案。VisualStudio * .obj文件大小(513Mb objs和534Mb lib)

當我建立項目到一個靜態庫所有* .obj文件的總大小是513Mb和生成的lib是534Mb。 每個obj文件是1-13Mb。 調試exe文件是11Mb。鏈接時代碼生成(/ Gm)已關閉。

在此先感謝。

回答

5

由於大量的重複代碼和符號被放置到多個對象文件中,因此對象文件往往會變大。通常這是由內聯函數和實例化模板代碼的副本引起的。

生成的可執行文件比所有目標文件的總和小得多,因爲重複的弱符號和未引用的符號可以被丟棄。個人而言,我不會擔心目標文件的大小,但是如果你想減少它,那麼儘量減少使用內聯函數,並考慮將模板代碼保存在與其他代碼不同的文件中,並使用顯式實例化來生成所需的僅在一個地方實例化。

例子

假設你在頭文件中有這個。

template< class T > 
inline void F(T* t) 
{ 
    // ... some code 
} 

如果您對少數幾種類型使用F,那麼每個翻譯單元將爲它使用的類型生成該函數的副本。

如果你只是一個聲明替換爲:

template< class T > void F(T* t); 

那麼你可以生成只是你在一個單獨的源文件需要instantations:

template< class T > void F(T* t) 
{ 
    // definition 
} 

template void F<int>(int*); 
template void F<char>(char*); 
template void F<MyType>(MyType*); 

當然,你現在必須手動管理您需要模板實例化的類型。

+1

你是什麼意思「使用顯式實例化只在一個地方生成所需的實例」? – kFk 2009-01-06 13:06:34