2011-09-06 162 views
9

無論何時我們編譯一個C++文件,都會生成一個obj文件。我想知道obj文件的大小取決於什麼因素?C++對象文件的大小取決於什麼?

只是爲了讓我的問題更清楚, 例如,一個C++文件包含一個類聲明,並且這個類有一個整型變量作爲數據成員,並且也有一些成員函數。如果我編譯這個文件,那麼一些obj文件將創建一些X大小。現在假設我添加了更多的數據成員和成員函數,那麼obj文件的大小會發生變化嗎?

+3

我不會試圖在「obj」文件大小和對象(內存)大小之間得出任何結論。你試圖達到什麼目標? –

+0

在這裏我感興趣的是obj文件的大小,因爲我知道對象大小將取決於它具有的數據成員。但是,你能告訴我,obj文件大小取決於什麼因素?其實我問這個在接受採訪時這樣想知道答案。 –

回答

10

這取決於一百萬個不同的因素,完全取決於平臺和編譯器以及設置。

對象文件必須包含函數體的所有程序集,用於具有外部鏈接的函數以及具有外部鏈接的所有全局變量。任何具有內部連接的東西都可能或可能不需要在目標文件中單獨輸入,因爲這些內容可能已被優化並直接集成到其呼叫站點中。這在很大程度上取決於優化設置。

GCC還有一個「鏈接時間優化」的選項,它基本上將整個源代碼的副本添加到目標文件並顯着增加其大小。

調試符號還增加了很多額外的數據。

對於您的C++特定問題:類定義本身在程序集中並不真正可見。非內聯成員函數只是需要編譯的更多函數,而數據成員只是被視爲基本數據成員 - 如果聲明瞭該類型的實例,它們將位於調用堆棧上,但它們不直接影響彙編代碼......除非你用常量初始化東西;當然,常量會進入代碼中。

+0

非常感謝Kerrek。 –

3

目標文件包含(除其他之外)源代碼編譯完成後,但在鏈接之前的機器代碼。因此目標文件的大小主要取決於代碼的複雜程度。

大多數編譯器都提供了在編譯過程中添加調試符號的選項,使調試變得更容易,但會增加目標文件的大小。您可以使用-g選件添加調試符號,並將它們與GCC中的-s選項一起刪除。 Visual Studio有類似的東西。

2

它依賴於編譯器,但是。

目標文件將包含可執行代碼,鏈接存根和元數據。元數據可以是任何依賴於編譯器的東西,所以它不存在問題 - 根據編譯器的想法,任何事情都可能發生。爲具有外部鏈接的所有實體創建鏈接存根,併爲所有對其他目標文件中的實體的傳出引用創建鏈接存根 - 這不會直接受到將成員添加到同一目標文件中的類中的影響。

現在編碼。當你添加一個成員變量時,它必須被構造和銷燬 - 這將需要一個構造函數和一個析構函數,這兩者都可能是微不足道的。如果它們不是微不足道的,這將導致代碼量的輕微增長,因爲現在需要做額外的事情來處理那些成員變量,並且需要額外的代碼。

相關問題