條款30 透徹了解inlining的裡裡外外

2022-01-24 00:34:05 字數 1508 閱讀 1373

可能造成程式體積較大,即使擁有虛擬記憶體,inling的**膨脹也會導致額外的換頁行為,降低快取記憶體裝置的擊中率,以及伴隨而來的效率損失。

總規則:inline只是對編譯器的乙個申請,不是強制命令。

規則一:inline的兩種方式:隱喻方式,明確提出方式。

隱喻方式,即在class宣告內定義函式,這樣的函式通常是成員函式。friend 函式也可以寫在class定義內。

明確宣告,即在函式定義前加關鍵字inline。

規則二:什麼函式不會被inline

注意:一般你申請inline的函式,編譯器沒有實現inline的話,會給出一條警告資訊。

規則三:什麼時候編譯器會既inline函式,又生成outline版本的函式

規則四:為什麼派生類的建構函式和析構函式通常並不是inline很好的候選者

因為c++在物件建立和銷毀時做了各種各樣的保證,例如乙個物件建立了一半後引發了異常,那麼c++需要把建立好的那部分給析構掉。這實際上都是有**在執行的,這些編譯器自己生成的**往往被編譯器放在建構函式和析構函式中。而乙個派生類就容易發生這樣的異常。因此,派生類的構造和析構函式並不是inline的很好的候選者。

規則五:為什麼基類的建構函式和析構函式通常並不是inline很好的候選者

如果base建構函式被寫成inline 的,那麼所有的替換base建構函式的**會被插入到派生類建構函式的呼叫內。

(1)inline和function template是沒關係的

由於function template函式和inline函式一般都位於標頭檔案內,誤使得我們認為function template一定是inline 的。這完全是錯誤的,inline和function template是沒關係的。下面解釋為什麼二者通常都放在標頭檔案內。

(2)為什麼inline函式需要放在標頭檔案內?

大多數的編譯環境在編譯期過程中進行inling,而為了將乙個「函式呼叫」替換為「被呼叫函式本體」,編譯器需要知道函式長什麼樣。(有些特別的編譯環境在聯結器甚至是執行期進行inling,但是大多數編譯器都是在編譯期。)

(3)為什麼function templates 通常也被置於標頭檔案內?

因為它一旦被使用,編譯器為了將它局現化,需要知道它長什麼樣子。(但是templates 的具現化也不一定都在編譯期,有些在連線期。)

(4)什麼時候function template需要inline?

如果你寫的function template 具現化的函式都應該是inlined的,那麼需要將此function template 寫成inline形式。如果你寫的function template 具現化的函式不都是inlined 的就不應該寫成inline形式。

(1)程式庫設計者必須評估將函式宣告為inline 的衝擊:**公升級

(2)程式開發人員對於inline 的注意:**除錯

大部分偵錯程式都對於inline函式束手無策,例如你不能在乙個不存在的函式內設定斷點。大部分偵錯程式禁止在除錯程式中發生inlining。

條款30 透徹了解inlining的裡裡外外

inline函式比巨集好用得多 tk2 編譯器通常被設計用來濃縮那些 不含函式呼叫 的 所以編譯器有力能對inline函式執行語境相關最優化。但inline也有另一面,對函式呼叫都以函式本體替換之,會增加目標 的大小 object code 在記憶體有限的環境中,造成的 膨脹會導致換頁行為,導致效率...

條款30 透徹了解inlining的裡裡外外

總結心得 1.首先inline只是對編譯器的乙個申請,不是強制命令,編譯器不是要強制執行你的這個inline,他根據實際情況接受或者拒絕。這個申請可以是隱式申請 比如定義在類內部的函式,或者定義在類內部的友元函式,會隱式申請為inline函式 顯示申請 在函式前面加inline 2.inline一般...

30 透徹了解inlining 的裡裡外外

1 inline方法相當於文字替換,不需要承擔方法呼叫的額外開銷,同時還有潛在的優勢,文字替換後,編譯器會進行 優化。而對於方法呼叫,編譯器沒有能力進行 優化。2 顯而易見,inline方法往往會導致目標 膨脹變大。但是,對於方法本體很小的情況,可能會出現,替換後的文字比方法呼叫的 還要小。這也意味...