在C語言中,宏函數常常被用來優化代碼以下降函數調用的開銷;而在C++中,一般更建議使用inline關鍵字而不是宏函數來實現相同的做用。函數
inline function中文翻譯叫內聯函數,即便用inline關鍵字來告訴編譯器能夠在代碼中展開函數實現,編譯器會在編譯期使用函數定義來替換函數的調用。優化
inline函數的使用方法很是簡單,在函數定義的前面加上inline修飾便可。翻譯
例如:debug
class Foo { public: inline int bar(int a, int b); } int Foo::bar(int a, int b) { return a + b; }
inline函數主要用來使一些實現比較簡單、調用頻繁的函數內聯化,以下降這些函數調用的開銷。
inline函數主要有如下這些優勢:code
避免函數調用開銷;對象
節省了函數參數入棧出棧的開銷;遞歸
節省了函數返回值的開銷;編譯器
固然inline函數也有一些缺點:io
會使代碼膨脹,增長的可執行文件的體積;編譯
inline函數改變後會讓全部使用該函數的代碼須要從新編譯;
可能使頭文件更加臃腫(inline函數常常實如今頭文件裏);
可能致使潛在更多的分頁錯誤;
inline關鍵字只是一個給編譯器的建議,而並非強制內聯。編譯器會本身決定要不要內聯。標了inline的編譯器也不必定會內聯,沒有標inline的編譯器也可能會內聯;
與宏相比,inline對debug更加友好;
全部直接在class聲明的時候直接給出定義的函數都是默認inline的,無論有沒有inline關鍵字;
虛函數一般不該該是inline的;可是在某些狀況下,例如在同一個函數體中聲明並構建一個對象,這樣的狀況下編譯器很是明確對象的類型,虛函數也是能夠被inline的;
模板類的方法雖然都是在頭文件中給出實現的,但不老是inline函數;
大多數編譯器會針對遞歸函數作inline處,並能夠控制inline的深度。例如msvc的-inline_recursion(on)或者gcc的--max-inline-insns-recursive;
若是inline函數被多處引用,必定要定義在頭文件中,不然編譯器在展開函數時沒法找到函數的定義就會報link錯誤;