關於優化內聯inline函式的一點思考

2021-10-06 23:59:21 字數 1225 閱讀 7305

程式的二八法則:「平均而言乙個程式的往往將80%的執行時間花在20%的**上」——scott meyers

目錄內聯函式呼叫機制:

內聯函式的缺點和優點

缺點:優點:

虛函式、建構函式、析構函式與內聯函式 參考

首先明確關於內聯函式的一些概念:

編譯器隱式的將在類內定義的成員函式當做內聯函式」——《cpp primer》 223頁中間部分

內聯函式的一些特徵:

但是刷oj的時候,大量的class內部成員函式,如下圖leetcode為例,都是inline嗎?

顯然不是!!!很好理解,大部分都不滿足上面提到的inline的幾個特徵。

內聯函式僅僅是一種請求而沒有強制性」——[stroustrup97] 7.1.1節

但是要完全理解上面這句話還要理解inline呼叫的過程。

**膨脹:過度熱衷inlining會造成程式提及太大,及時擁有虛記憶體,inline造成的**膨脹會導致額外的換頁行為,降低指令快取記憶體裝置的擊中率,隨之帶來效率損失。

前面說了這麼多缺點和注意事項,沒有優點嗎?當然,存在即合理嘛!

很顯然,虛函式是不能被優化成內聯函式的

虛函式意味著「等待直到執行是才決定呼叫哪個函式

而內聯函式意味著「執行前,先將呼叫動作替換為被呼叫函式的本體

很明顯相互矛盾!

class中的建構函式,意味著建立乙個物件時,每個成員變數都會被自動構造,編譯器會進行大量的異常處理,所以明顯不符合內聯函式小型化的特徵,這個優化建議編譯器肯定不會接受!

inline 內聯函式

一 inline關鍵字用來定義乙個類的內聯函式,引入它的主要原因是用它替代c中表示式形式的巨集定義。表示式形式的巨集定義一例 define expressionname var1,var2 var1 var2 var1 var2 為什麼要取代這種形式呢,且聽我道來 1 首先談一下在c中使用這種形式巨...

inline內聯函式

技術類筆試題50 都會問巨集與inline的區別,自己去找找看?1 巨集替換發生在預編譯 2 巨集函式 如果可以這麼叫的話 替換時不會檢查引數,inline函式會檢查 3 巨集一定會發生替換,inline貌似不是強制的,編譯器想不替換也沒關係 4 巨集替換時存在著一些不可避免的陷阱 參見c trap...

inline內聯函式

一 內聯函式 內聯函式是指用inline關鍵字修飾的函式 它與普通函式所不同之處只在於函式呼叫的處理。普通 函式進行呼叫時,要將程式執行權轉到被呼叫函式中,然後再返回到呼叫它的函式中 內聯函式不是在呼叫時發生執行權轉移,而是在編譯時將 函式 體 嵌入在每乙個呼叫處。編譯時類似巨集替換,使用 函式體替...