天天看點

C++學習-内聯函數

1、内聯函數的作用

每一次函數調用都要把原來正在運作的函數的大量資料以及狀态标志等壓棧,是以每一次函數調用都要消耗棧空間,而頻繁的調用小函數便會大量的消耗棧空間。于是c++中便特别地引入了inline修飾符,表示為内聯函數。

内聯函數事實上是在調用程式中對被調用的内聯函數進行展開,這樣便避免了頻繁調用函數對棧記憶體重複開辟所帶來的消耗。

2、内聯函數的具體實作方式

編譯器将函數類型包括函數名、參數個數及其類型還有傳回值類型儲存在符号表中,當函數體的文法無誤時将其實作也儲存在符号表中,代碼的形式取決于編譯器。當遇到調用内聯函數時,編譯器會分析參數和傳回值類型并可能做适當的強制轉換,都沒有問題時就會進行代碼替換,并可能還有進一步的優化。

3、内聯函數與宏展開的差別

宏展開是單純的代碼替換,在預處理階段完成,因為是簡單的代碼替換,是以很容易出現悲劇;inline函數雖然也是對函數進行展開,但是在編譯階段進行代碼展開,參與類型檢查,滿足類型和作用域規則。

4、内聯函數的局限

内聯函數是程式設計者向編譯器提出的一個申請,當内聯函數的函數體過大時,編譯器可以拒絕申請,這樣内聯函數的執行效率便和普通函數一樣了,是以内聯函數不能包含複雜的控制語句例如while、switch等,并且内聯函數本身不能是直接遞歸函數。

  

5、内聯函數應用

對類中的私有成員進行指派和通路等操作的函數常常聲明為内聯函數,因為這些函數往往函數體較小,但卻經常被調用,使用内聯函數可以大大提高程式效率。

繼續閱讀