2016-01-27 35 views
1

我使用MSVC++和Visual Studio 2012,建立基本的非託管C++在x86/x64 Windows和控制檯子系統的方案。 (異常處理關閉)在什麼條件下必須CPP代碼編譯和鏈接到該exe

我有一個相當大的項目,當對最終的EXE大小好奇時,我決定看看如果我將main()函數改爲什麼也不做(因此不會調用或我注意到exe文件的大小仍然比我去的時候大得多,並且從項目中刪除了所有cpp文件。

所以我想知道什麼類型的C++代碼會導致代碼是即使main函數沒有任何作用,也可以鏈接在一起。一個例子是在你的一個類型爲A的cpp文件中有一個全局變量,其中A是一個類/結構體,在這種情況下,我假定A的構造函數和析構函數必須被包括在內,以及A的所有成員類型的構造函數和析構函數秒。

在Visual Studio中我有所有優化接通包括所述接頭的人,以消除功能/數據不會被引用,並COMDAT摺疊。和cpp代碼生成以啓用comdats /功能級別鏈接。

更新: 我沒有使用任何C++ 11或更高版本的功能。雖然我不確定我的構建環境是否爲C++ 11或更高版本構建,或者這會產生什麼影響。

+0

有多大,你的情況大嗎? – prabindh

+0

〜100k vs〜50k當所有cpp被刪除時。我使用靜態鏈接的vcpp庫而不是dll。當它正在建設和使用大多數功能和類時,exe也是約150k。 (而不是導致大約100k的空主功能) – matt

回答

1

從技術上講,一個全球性的不需要被列入只是因爲它有一個構造函數。 C++遵循圖模型,其中main充當根翻譯單元。從一個TU到另一個TU的函數調用形成圖的邊。獨立TU可能會被跳過。

MSVC++有另一種選擇,不使用TU但各個功能如在圖(/ COMDAT)的節點。與/ OPT:ICF結合使用可以進一步縮小可執行文件的大小。拋出函數本身就是一種勝利,但也可以消除附加依賴。

該模型的缺點是,某些自行註冊方案是不可移植的,作爲類做自注冊不是任何一個依賴因而受到去除。

相關問題