2010-03-16 50 views
3

我的本地C++ COM組件使用ATL。在DllRegisterServer()我打電話CComModule::RegisterServer()如何使Visual C++ 9不發出實際上從未被調用過的代碼?

STDAPI DllRegisterServer() 
{ 
    return _Module.RegisterServer(FALSE); // <<< notice FALSE here 
} 

FALSE傳遞給指示未註冊類型庫

ATL可作爲來源,所以我其實編譯CComModule::RegisterServer()實施。某處調用堆棧有一個if聲明:

if(doRegisterTypeLibrary) { //<< FALSE goes here 
    // do some stuff, then call RegisterTypeLib() 
} 

編譯器看到所有上面的代碼,因此它可以看到,實際上if條件總是,但是當我檢查連接進度消息我看到對RegisterTypeLib()的引用仍然存在,因此if語句不會被消除。

我可以使Visual C++ 9更好的表現靜態分析和實際看到一些代碼永遠不會被調用,而不是發出該代碼?

+1

不應該檢查asm輸出,而不是鏈接器進度消息?在鏈接階段結束之前,代碼可能不會被消除。 – jalf 2010-03-16 12:40:47

回答

0

原來,關鍵是通過編譯器設置一直啓用鏈接時代碼生成器。

它必須在一般卡中啓用 - 整個程序優化必須設置爲「使用鏈接時代碼生成」。它必須在C++ - >優化選項卡上啓用 - 「必須將整個程序優化*設置爲」啓用鏈接時生成代碼「,並且必須在鏈接器上啓用 - >優化選項卡 - 鏈接時間碼生成必須設置爲「使用鏈接時間碼生成」,然後/ OPT:REF和/ OPT:ICF(再次,*鏈接器 - >優化)選項卡必須都啓用。

這樣可以有效地消除RegisterTypeLib()的調用 - 它不再位於導入的符號列表中。

1

你有整個程序優化活動[/ GL]嗎?這似乎是編譯器通常無法自行完成的那種優化。

+0

試過 - 它沒有幫助。 – sharptooth 2010-03-16 12:02:32

1

確定的代碼不會在編譯後消除/聯過程?你檢查過生成的ASM嗎?

如何被定義的RegisterTypeLib功能?當然,標記爲dllexport的任何東西都不能被鏈接器清除,但任何未標記爲靜態(或放置在匿名名稱空間中)的函數都可以被多個轉換單元引用,因此編譯器將無法消除該函數。 鏈接器可以做到這一點,但這可能是它執行的最後一次優化之一(我不知道它應用優化的順序),所以符號可能仍然存在於您正在查看的消息中,甚至如果他們之後被淘汰。

+0

我還對編譯好的可執行文件使用了靜態分析工具 - 它說調用RegisterTypeLib的代碼仍然存在。所以它不會被消除。 – sharptooth 2010-03-17 09:13:38

1

任何成功內聯的代碼只會在被調用時生成。只要編譯器會採取提示,這是一個簡單的方法。內嵌是隻有一個建議雖然

1

到AtlComModuleRegisterServer內呼叫具有外部連接,其通常阻止了優化從傳播bRegTypeLib值向下調用圖。其中的一些可以在反彙編中更好地推理。

所以DllInstall(...)調用CAtlDllModuleT::RegisterServer(0)。這是問題的開始:

push 0 
call [email protected][email protected]@@@[email protected]@[email protected] 

讓我們只說爲了討論編譯器已經驗證CAtlDllModuleT::DllRegisterServer只調用一次,它是非常安全的推0/FALSE擊倒一個水平...外聯動可以防止丟棄AtlComModuleRegisterServer,內聯代價高(代碼重複)並且不允許任何額外的整個程序優化。這可能是更安全,以保持簽名,是早期用常規的cdecl調用保釋出來...

[email protected][email protected]@@@[email protected]@[email protected] proc near 
<trimmed> 
push 0 
push edx 
push offset ATL::_AtlComModule 
call [email protected] 

這個代碼可以在尺寸由於兩個常量得到改善,但它很可能耗資約的相同數量的運行時間。如果性能是一個問題,考慮明確設置function layout order,則可能會保存頁面錯誤。

+0

我不得不不接受這個答案 - 事實證明這並不重要。看到我自己的答案。 – sharptooth 2010-04-05 08:03:01

相關問題