C++支持內聯函數,目的是為了提高函數的執行效率,類似於C語言中的宏定義
內聯函數在調用時將它在程序中的每個調用點展開,不用額外分配棧空間
內聯函數的定義在一個源文件中出現一次,但在多個源文件中可以同時出現,只要保證完全相同即可。
所以內聯函數可以直接在頭文件中定義,即使被多次包含,也是完全相同的,因此不會報錯。
inline 內聯函數的使用方法:
inline 放在函數定義的返回值前面,就可以將函數指定為內聯函數;僅僅放在聲明函數前面時無效的
inline 返回值 函數名(形參)
{
函數體
}
舉例:
#include <iostream> using namespace std; // add 函數定義時有inline,聲明時沒有inline,但依然是內聯函數 int add(int a, int b); // dec 函數定義時沒有inline,聲明時有inline,但依然不是內聯函數 inline int dec(int a, int b); inline int add(int a, int b) { return (a + b); } int dec(int a, int b) { return (a - b); } int main(void) { // 調用add(2, 3)時直接被替換為(2 + 3) cout << add(2, 3) << endl; // 調用時不會替換,要進行壓棧出棧操作 cout << dec(5, 3) << endl; return 0; }
注意:
1、內聯函數以代碼增大的代價減少函數調用的開銷,禁止濫用,只有函數體簡單短小,才可以使代碼更加高效
2、如果函數代碼較長或有循環語句,使用內聯函數會增大內存的消耗,不能使用內聯函數
宏定義與內聯函數的區別
1、宏定義是由預處理器控制實現,而內聯函數是通過編譯器控制實現
2、宏定義在預處理時就對其進行展開替換,而內聯函數是在調用時對其展開替換
3、內聯函數是真正的函數,但使用時像宏定義一樣展開,取消了函數的參數壓棧出棧的開銷
4、宏定義不檢查參數返回值等,只是對其展開,而內聯函數會檢查參數返回值等,相對更安全
5、宏定義在運行時不可以調試,而內聯函數可以