2012-11-18 68 views
0

可能重複:
When to use inline function and when not to use it?何時可以不內聯函數?

在什麼條件下可以(不要)功能不能被內聯(僅限於C++)?

兩個條件的我know是:

1。如果函數有遞歸調用

2。如果函數中存在靜態變量

+0

請注意,內聯的能力並不一定意味着它會。最終的決定屬於編譯器,無論你使用什麼編譯標記 – SomeWittyUsername

+0

我不問我什麼時候不應該,但是當我**不能**時。 – asheeshr

+0

你對2)的引用是什麼? –

回答

2

inline是C++的關鍵字,但內聯是編譯器後端執行的通用過程,通常在指令序列已生成之後。

C編譯器也會內聯函數,而C++編譯器會內聯不是inline的函數。出於任何原因,C++編譯器也可能無法內聯inline函數。關鍵字實際上存在於指定一個函數在不同翻譯單元(源文件)中可能具有多個相同的定義。

靜態變量對是否可以內聯內容沒有特別的影響。也許一些編譯器難以鏈接全局變量引用的結果結構,但這更像是一個錯誤而不是經驗法則。

遞歸函數也可以內聯。遞歸調用應該被轉換爲分支。然後該分支可以通過循環展開作爲目標。

編譯爲超過千字節代碼的函數通常不會被內聯。但編譯器可能會提供#pragma指令或特定於平臺的屬性以在這種情況下強制內聯。

阻止函數被內聯的最大因素是源代碼在編譯器生成時不可用。鏈接時優化打開內聯功能的可能性是extern而不是inline,但DLL提供的函數肯定是不受限制的。但是,你仍然可以通過JIT風格的執行引擎運行它,並且可以內聯(拼接)任何它喜歡的隨機片段。

1

函數不能被內聯的唯一情況是編譯單元中沒有該函數的定義。即使這樣也不會阻止鏈接時間優化器的鏈接時內聯。

請注意,inline關鍵字實際上只是一個提示 - 編譯器可能會選擇不內聯函數,並選擇不使用內聯函數。

+0

作者提及的問題是什麼? http://books.google.co.in/books?id=TN9wQjjDwp0C&lpg=PP1&pg=PA83#v=onepage&q&f=False 我無法理解前兩個條件或爲什麼他們.. – asheeshr

+0

@AshRj那本書在講垃圾。作者不瞭解'inline'。這是一個非常常見的誤解。 Potatoswatters回答對我來說很好。理解C++中的inline關鍵字和編譯器是否內聯一個函數並不是一回事很重要。編譯器可能會內聯一個你沒有告訴它的函數,並且它可能沒有內聯你告訴它的函數。編譯器只要正確運行你的程序就可以做它喜歡的事情。 – john

+0

@john你是第三個告訴我這本書是垃圾的人!不能做任何事情..它被認爲是一本很好的介紹C++的OOP OOP的書。我的教授 – asheeshr