一.什麼是內聯函數
內聯函數的簡單理解就是編譯的時候把函數定義替換到調用的位置,用來降低運行時間,編譯器將使用函數的定義體來替代函數調用語句,這種替代發生在編譯階段
但是內聯函數僅僅只是對於編譯器的建議,編譯器是不是採取你的建議取決於函數是不是符合內聯的有利條件,不然編譯器將忽視函數的內聯聲明.
inline int add(int a , int b )
{
return a+b;
}
int main()
{
int num1 = 1;
int num2 = 2;
int sum = add(num1, num2) ; // 其實就是 num1 + num2
}
二.內聯函數的好處?
- 減少函數調用帶來的開銷,什麼是函數調用開銷?如果一個函數被頻繁的調用,那麼有函數不斷的入棧,函數棧,會造成棧控件的大量消耗
- 棧控件是函數內的數據的內存空間,系統下,棧空間是有限的,函數的死循環遞歸調用的最終結果是導致棧內存空間的枯竭
三.內聯函數的編程風格
1.inline 必須與函數定義體
放在一起纔可以稱爲內聯函數
inline void Foo();
void Foo(){
}
void Foo(); 可以實現
inline void Foo(){}
inline 用於實現的關鍵字 ,而不是一種用於聲明的關鍵字,但是聲明與定義不可混爲一談,用戶也沒有必要,知道函數是不是需要內聯
2.inline 的使用有限制
的
- inline只使用函數體代碼簡單的函數,不能包含太過複雜,不能是遞歸函數 ,虛調用,通過函數指針調用,使用alloca , 不然會直接拒絕優化
四.慎用內聯
可能很多同學覺得inline 這好,乾脆把所有的函數都聲明爲內聯,內聯是可以提高函數的執行的效率,內聯以代碼膨脹爲代價,省去函數調用的開銷來提高執行效率
以下情況不宜使用內聯:
(1)如果函數體內的代碼比較長,使用內聯將導致內存消耗代價較高。
(2)如果函數體內出現循環,那麼執行函數體內代碼的時間要比函數調用的開銷大。