編譯C++代碼時,GCC是否曾嘗試通過選擇內聯沒有標記爲inline
關鍵字的函數來優化速度?GCC內聯C++函數沒有「內聯」關鍵字嗎?
回答
是的。任何編譯器都可以自由地內聯任何函數,只要它認爲它是一個好主意。海灣合作委員會也這樣做。
在-O2優化級別上,內聯是在編譯器認爲值得這樣做的時候完成的(使用試探法)和如果它不會增加代碼的大小。在-O3中,只要編譯器認爲它值得做,就會完成,無論它是否會增加代碼的大小。此外,在所有優化級別(即啓用優化)中,僅調用一次的靜態函數被內聯。
GCC說: '-finline-functions'「考慮內聯的所有函數,即使它們沒有聲明爲內聯。」我推斷,即使使代碼尺寸變大,用inline聲明的函數也會被考慮用於內聯?許多人聲稱從'inline'到編譯器的提示已經過時了,但這意味着'-O2'提示不會被廢棄,因爲它只會內聯使得代碼更大的函數,如果他們有'inline'關鍵字的話。但是' -O3'它會過時(我意味着提示......「inline」關鍵字有其他目的)。 – 2015-12-28 16:29:44
我無法創建一個大的函數來用'-O2'來內聯。我創建的與-O3內聯的每個功能也都與-O2一起內聯。關於'-finline-small-function'的GCC說:「當它們的主體小於預期的函數調用代碼時,將函數集成到它們的調用者中(所以程序的整體尺寸變得更小)」。但是,即使使用-O2來查看程序集,它顯然會使代碼更大。你有沒有一個例子O3內聯但O2不? – 2015-12-28 16:55:06
@AnT如何防止編譯器內聯僅調用一次的函數。 – bharath 2018-01-19 10:36:43
是的,特別是如果您啓用了高級別的優化。
有一個標誌,你可以提供給編譯器來禁用它:-fno-inline-functions。
實際上,-fno-inline-functions禁止自動內聯,-fno-inline抑制所有內聯(來源:http://gcc.gnu.org/onlinedocs/gnat_ugn_unw/Switches-for-gcc.html) – KeatsPeeks 2009-10-26 17:58:35
好的,我會根據你的評論進行更新,謝謝你的回覆。 – Marcin 2009-10-26 18:02:06
如果使用'-finline-functions'或'-O3',它會內聯函數。你也可以使用'-finline_limit = N'來調整它的內聯。
「-O3 此選項打開更昂貴的優化,如內聯函數」
它們是昂貴的,因爲該功能本質上是重複的,犧牲了內存的速度。 – 2009-10-26 17:53:35
@ Ape-inago:這取決於...對於像運算符和訪問器這樣的小型通用函數,內聯版本通常比較廉價,因爲內聯函數的指令比在函數調用周圍保存和恢復寄存器要少。 – Adisak 2009-10-26 21:58:06
*潛在的昂貴* – 2009-11-18 14:48:38
是的,確實如此,但它也將產生非內聯功能體爲非static
非inline
功能,因爲這是來自其他翻譯單元的呼叫所需的功能。
對於inline
函數,如果函數在任何特定的翻譯單元中使用,則無法提供函數體是錯誤的,所以這不是問題。
- 1. C,內聯函數和GCC
- 2. 推薦gcc內聯函數
- 3. C/C++編譯器可以內聯malloc()內聯函數嗎?
- 4. 爲什麼gcc沒有爲這個函數決定內聯或者不內聯?
- 5. C++內聯函數
- 6. Django - 內聯(沒有外鍵)
- 7. C++的gcc串內聯
- 8. GCC預處理器內聯函數名
- 9. 內聯函數在其他內聯函數用C
- 10. GCC內聯彙編中的C數組?
- 11. C++函數指針內聯
- 12. C++中的內聯函數
- 13. C:指針內聯函數
- 14. C++中的內聯函數
- 15. C++隱含內聯函數
- 16. C++內聯函數原型
- 17. c中的內聯函數
- 18. 內聯函數
- 19. 內聯函數
- 20. 內聯函數
- 21. 在模板中使用內聯關鍵字有意義嗎?
- 22. 聯動的內聯函數
- 23. C++鏈接器會自動內聯函數(沒有「inline」關鍵字,沒有在頭文件中實現)?
- 24. 我必須重申對函數實現內聯關鍵字
- 25. 爲什麼內聯函數需要static關鍵字?
- 26. GCC彙編內聯:與只有內聯彙編代碼
- 27. 內聯函數的函數指針C
- 28. g ++/gcc在展開遞歸內聯函數時有多有效?
- 29. C++異常,GCC和「內聯函數」標誌
- 30. 有沒有辦法在c#中強制函數內聯?
根據規範,C++中的'inline'關鍵字與編譯器優化沒有任何關係。關鍵字只是意味着鏈接器應該會看到該函數的多個定義。這恰好使內聯*優化變得更容易(因爲可以在多個翻譯單元中使整個定義可見),但是這樣做盡可能接近。編譯器可以內聯未標記爲「inline」的函數,並且標記爲「inline」的函數不一定由編譯器內聯。 – jalf 2009-10-26 21:43:25
請注意,在類定義內部定義的方法(即在'{...};'之間')默認爲'inline',即使沒有關鍵字。 – MSalters 2009-10-27 09:43:51