2010-08-07 84 views
3

函數的要求是什麼,所以它可以在C++中內聯執行? 有沒有一個函數不能內聯的情況? 或任何函數都可以內聯,程序員有責任根據運行時間和編譯時間考慮決定如何定義函數?函數在C++中的內聯要求

+2

內嵌是onnly一個「請求」的編譯器。編譯器決定是否內聯,通常基於長度和複雜性的考慮,但編譯器從不內聯任何東西是合法的。請參閱http://stackoverflow.com/questions/1443982/when-do-compilers-inline-c-code – 2010-08-07 14:51:56

回答

3

函數的要求是什麼,所以它可以執行 inline in C++?

它需要在每個被調用的地方定義(通常這是通過將其放在.h中完成的)。

是否存在函數不能 內聯的情況?

不以語言標準來說,我相信,儘管當然每個編譯器都可以並且會實現一些自己的限制。

或任何功能可內嵌和它 是 程序員的責任來決定如何定義 功能,可以根據運行時間和 編譯時間方面的考慮?

inline關鍵字是剛剛從程序員的編譯器,程序員會很喜歡這個功能被內聯(可能是程序員已經發現有一個小功能被稱爲「熱」循環實質性調用開銷的提示如分析器所示 - 或者,函數非常小以至於與調用代碼一樣小;-)或者,內聯函數允許「跨函數邊界優化」,以便特定編譯器無法識別或可以否則不執行 - 等等)。

編譯器可以自由地忽略只是因爲它是免費的忽略老register提示爲變量的存儲類的提示(我相信時下最優化的C++編譯器忽略register但很少忽略inline) - 督察,編譯器可以自由地內聯全部或部分調用函數,而不管該函數是否被聲明爲inline。 (當然,當它們通過一個顯式指針指向某些點隱藏並在其他位置使用的函數時完成時,或者當函數的地址作爲參數傳遞給它時,它不會「內聯調用」一些其他函數 - 但這可能會影響特定調用的內聯,而不一定是其他調用相同函數的調用不同)。

「以防萬一」你的編譯器需要你inline提示很認真,它往往是值得衡量的代碼大小和速度與不inline左右(除非你的編譯器提供了一個選項/標誌爲目的,只是一種#define inline肯定會「禁用「inline的效果,從而允許這種測量)。但是如果你打算在多個編譯器上部署你的代碼,對於多種體系結構,請注意,考慮到CPU架構中編譯器的優化策略的差異,在一個平臺上產生的積極影響可能會在另一個平臺上產生反作用。

5

這取決於你的意思。如果你的意思是,什麼時候該函數可以在線擴展,刪除一個函數調用,那麼這真的取決於編譯器。它可能內聯幾乎所有函數,並拒絕內聯幾乎所有你要求的函數。可能不會內聯的函數包括遞歸函數,以及您已經使用函數地址的函數。總的來說,最好不要考慮這個問題。

inline關鍵字的主要用途不是要求內聯,而是要表明該函數可能包含在多個翻譯單元中,而不會導致多重定義錯誤。

+2

+1。但是許多遞歸函數*可以實際內聯(特別是,但不限於尾遞歸函數)。 – 2010-08-07 15:20:49

1

或任何函數都可以內聯,程序員有責任根據運行時間和編譯時間考慮決定如何定義函數?

它是基於某些條件的編譯器使用函數作爲內聯函數。

4

函數的需求是什麼,所以它可以在C++中內聯執行?有沒有一個函數不能內聯的情況?

內聯函數只是函數調用被實際代碼替換的函數。如果按照該定義進行操作,則可以手動複製和粘貼代碼,並且它將「內聯」。但是,這並不總是一個好主意:這是速度與程序大小的問題。隨着功能越來越大,使其內聯的好處減少了。

或任何函數都可以內聯,程序員有責任根據運行時間和編譯時間考慮決定如何定義函數?

通常,當您使用inline關鍵字時,它只是一個請求,編譯器會選擇是否實際進行內聯函數調用。許多編譯器還提供了一種強制內聯函數的方法(例如,MSVC的關鍵字爲__forceinline) - 在這種情況下,編譯器不會很聰明,因此您應該權衡製作函數內聯。

+3

即使'__forceinline'在所有情況下都不起作用 - 考慮不能被重構爲遞歸的遞歸函數。在這種情況下,只能對內部函數的外部調用進行內聯,而不能對隨後的調用(對其本身)進行內聯。 – 2010-08-07 15:22:22

+0

@Konrad:沒錯,我沒有想到。 – casablanca 2010-08-07 17:43:14

+0

是的,__forceinline實際上並不強制編譯器內聯。 – Puppy 2010-08-07 17:50:07

1

內聯函數取決於代碼和代碼的複雜的長度... :) 內聯函數僅僅是編譯器的請求...