2013-05-03 35 views
3

我想我知道什麼內嵌關鍵字(看起來我沒有),但與今天的編譯器(Visual Studio 2012的C++編譯器在我的情況),它是由編譯器或編譯器忽視它和內嵌其認爲好的方法?它有助於將方法標記爲在C++中內聯嗎?

+0

我們是否使用.net?後者是 – VoronoiPotato 2013-05-03 18:04:03

+1

。至少啓用了優化。 – john 2013-05-03 18:04:08

+0

請記住'inline'只是一個_hint_,並不意味着內聯是強制性的。 – 2013-05-03 18:04:55

回答

16

inline關鍵字與內聯無關。它實際上意味着:該函數的多個定義可以出現在同一程序中的不同翻譯單元中,而不會違反一個定義規則。

僅使用它的是,即,如果你在報頭中定義的功能,然後將其標記爲inline(使得多個翻譯單位包括所述報頭,從而生成所述功能可連接在一起)。

+1

是的,但前提是該方法是在類之外的頭部定義的。 – 2013-05-03 18:07:34

+4

@ScottJones:在類中定義的成員函數隱式地作爲模板函數(從ODR的角度來看)是'inline'。 – 2013-05-03 18:09:38

+1

正確 - OP可能不知道... – 2013-05-03 18:11:34

2

您提到您使用的是Visual Studio 2012,因此您可以使用某些Microsoft特定的說明符強制您想要的內聯行爲。

通常,編譯器會使用自己的判斷來確定何時應該內聯函數。但是,如果您知道(因爲您具有編譯器無法通過靜態分析源代碼獲得的某些應用程序的上下文或知識),因此確實應該內聯內容並希望覆蓋編譯器的判斷,則可以使用__forceinline關鍵字。

應當指出的是,有沒有保證特定功能將被內聯,即使使用__forceinline,雖然如此,它認爲它是不是一個強大的建議編譯器以外的任何不是安全的。

在大多數情況下,最好將決定留給編譯器,如果您想根據運行時行爲進一步優化,請使用類似配置文件引導優化(PGO)的選項,它將選擇如何優化包括哪些內聯函數),基於哪些代碼路徑實際上在運行時最頻繁地被擊中。

相關問題