2009-10-26 46 views
25

編譯C++代碼時,GCC是否曾嘗試通過選擇內聯沒有標記爲inline關鍵字的函數來優化速度?GCC內聯C++函數沒有「內聯」關鍵字嗎?

+10

根據規範,C++中的'inline'關鍵字與編譯器優化沒有任何關係。關鍵字只是意味着鏈接器應該會看到該函數的多個定義。這恰好使內聯*優化變得更容易(因爲可以在多個翻譯單元中使整個定義可見),但是這樣做盡可能接近。編譯器可以內聯未標記爲「inline」的函數,並且標記爲「inline」的函數不一定由編譯器內聯。 – jalf 2009-10-26 21:43:25

+2

請注意,在類定義內部定義的方法(即在'{...};'之間')默認爲'inline',即使沒有關鍵字。 – MSalters 2009-10-27 09:43:51

回答

31

是的。任何編譯器都可以自由地內聯任何函數,只要它認爲它是一個好主意。海灣合作委員會也這樣做。

在-O2優化級別上,內聯是在編譯器認爲值得這樣做的時候完成的(使用試探法)如果它不會增加代碼的大小。在-O3中,只要編譯器認爲它值得做,就會完成,無論它是否會增加代碼的大小。此外,在所有優化級別(即啓用優化)中,僅調用一次的靜態函數被內聯。

+0

GCC說: '-finline-functions'「考慮內聯的所有函數,即使它們沒有聲明爲內聯。」我推斷,即使使代碼尺寸變大,用inline聲明的函數也會被考慮用於內聯?許多人聲稱從'inline'到編譯器的提示已經過時了,但這意味着'-O2'提示不會被廢棄,因爲它只會內聯使得代碼更大的函數,如果他們有'inline'關鍵字的話。但是' -O3'它會過時(我意味着提示......「inline」關鍵字有其他目的)。 – 2015-12-28 16:29:44

+1

我無法創建一個大的函數來用'-O2'來內聯。我創建的與-O3內聯的每個功能也都與-O2一起內聯。關於'-finline-small-function'的GCC說:「當它們的主體小於預期的函數調用代碼時,將函數集成到它們的調用者中(所以程序的整體尺寸變得更小)」。但是,即使使用-O2來查看程序集,它顯然會使代碼更大。你有沒有一個例子O3內聯但O2不? – 2015-12-28 16:55:06

+0

@AnT如何防止編譯器內聯僅調用一次的函數。 – bharath 2018-01-19 10:36:43

7

是的,特別是如果您啓用了高級別的優化。

有一個標誌,你可以提供給編譯器來禁用它:-fno-inline-functions。

+2

實際上,-fno-inline-functions禁止自動內聯,-fno-inline抑制所有內聯(來源:http://gcc.gnu.org/onlinedocs/gnat_ugn_unw/Switches-for-gcc.html) – KeatsPeeks 2009-10-26 17:58:35

+0

好的,我會根據你的評論進行更新,謝謝你的回覆。 – Marcin 2009-10-26 18:02:06

3

如果使用'-finline-functions'或'-O3',它會內聯函數。你也可以使用'-finline_limit = N'來調整它的內聯。

1

「-O3 此選項打開更昂貴的優化,如內聯函數

+0

它們是昂貴的,因爲該功能本質上是重複的,犧牲了內存的速度。 – 2009-10-26 17:53:35

+1

@ Ape-in​​ago:這取決於...對於像運算符和訪問器這樣的小型通用函數,內聯版本通常比較廉價,因爲內聯函數的指令比在函數調用周圍保存和恢復寄存器要少。 – Adisak 2009-10-26 21:58:06

+0

*潛在的昂貴* – 2009-11-18 14:48:38

1

是的,確實如此,但它也將產生非內聯功能體爲非staticinline功能,因爲這是來自其他翻譯單元的呼叫所需的功能。

對於inline函數,如果函數在任何特定的翻譯單元中使用,則無法提供函數體是錯誤的,所以這不是問題。