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

2021-08-10 12:17:21 字數 714 閱讀 4389

總結心得:

1.首先inline只是對編譯器的乙個申請,不是強制命令,編譯器不是要強制執行你的這個inline,他根據實際情況接受或者拒絕。

這個申請可以是隱式申請:比如定義在類內部的函式,或者定義在類內部的友元函式,會隱式申請為inline函式

顯示申請:在函式前面加inline

2.inline一般情況下放在標頭檔案中,因為編譯器在編譯期間對於呼叫內聯的函式語句需要替換為相應函式,因此需要直到這個函式的具體內容。對於模版,如果把模版函式宣告為inline函式的話,這個模版的所有例項都是內聯函式,會產生產生大量的**,因此如果沒有必要盡量不要把它宣告為inline

3大部分編譯器,對於過於複雜的函式比如內部有迴圈,遞迴之類的函式就會忽略inline請求

4.對於虛函式,也不執行inline,因為虛函式是在執行期間才知道需要呼叫哪個函式,而inline是在編譯期間進行替換,因此編譯器無法知道呼叫替換哪個函式,所以拒絕inline

5.有時候即使編譯器有意向將乙個函式看作inline,但還是不一定會如願以償,這個取決於你的呼叫方式,比如你用函式指標去呼叫函式的話,他就不執行inline,如果是函式名進行呼叫,就是inline

6.把類的建構函式和析構函式宣告為inline,這也是不推薦的做法,因為不經意間編譯器就會為你默默填寫大量的函式,尤其在繼承的體系中。

所以在使用inline一定要慎重,一開始先不要宣告inline函式,在優化的時候在考慮把哪些函式宣告為inline

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

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

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

可能造成程式體積較大,即使擁有虛擬記憶體,inling的 膨脹也會導致額外的換頁行為,降低快取記憶體裝置的擊中率,以及伴隨而來的效率損失。總規則 inline只是對編譯器的乙個申請,不是強制命令。規則一 inline的兩種方式 隱喻方式,明確提出方式。隱喻方式,即在class宣告內定義函式,這樣的函...

30 透徹了解inlining 的裡裡外外

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