2016-11-17 68 views
0

我正在考慮之間的標題只與頭&源設計。我不確定頭文件&源代碼是否允許編譯器跨目標文件和跨鏈接進行優化?如內聯優化?C編譯器能夠跨目標文件進行優化嗎?

+1

編譯器只看到一個單獨的翻譯單元。所以不,它不是。但鏈接器可以。閱讀關於LTO。不管它是什麼:不要做過早的優化!編寫可維護的代碼,不要將定義放入頭文件中(除了'inline'函數,它只應該是短函數)。 – Olaf

回答

3

通常將頭文件和源文件編譯爲單個翻譯單元(因爲頭文件包含在源文件中)。所以,這不會是一個問題(除非你有一個獨特的環境,其中 頭被分別編譯)。

GCC支持跨不同翻譯單元進行優化。請參閱Link Time Optimization

-flto選項的使用說明:

-flto [= N]

這個選項運行標準的鏈接時優化。當用 源代碼調用時,它將生成GIMPLE(GCC的內部 表示之一),並將其寫入對象 文件中的特殊ELF部分。當目標文件鏈接在一起時,所有功能 正文從這些ELF部分讀取並實例化,就好像它們的 已經是同一翻譯單元的一部分。要使用鏈接時間優化器 ,應在編譯時和最終鏈接期間指定-flto和優化選項。建議您 使用相同的 選項編譯參與同一鏈接的所有文件,並在鏈接時指定這些選項。

+0

不要忘記用'-flto'和一些*優化標誌*編譯*和鏈接*。通常,'make CC ='gcc -flto -O2'' –

+0

那麼爲什麼'-flto'不是默認的?有沒有理由不這樣做? – w00d

+0

@ w00d正如爲什麼大多數優化默認情況下不啓用:1)它可能很昂貴,2)調試可能更困難,3)偶爾會導致錯誤(優化器中的錯誤)等等。而不是用戶可能需要它(或一個/多個先前陳述的可接受的理由)。 – usr