用關鍵字inline修飾的函數就是內聯函數。關鍵字在函數聲明和定義的時候都要加上,不寫系統還是會當成常規函數
2.內聯函數與一般函數的區別
1)內聯含函數比一般函數在前面多一個inline修飾符
2)內聯函數是直接複製“鑲嵌”到主函數中去的,就是將內聯函數的代碼直接放在內聯函數的位置上,這與一般函數不同,主函數在調用一般函數的時候,是指令跳轉到被調用函數的入口地址,執行完被調用函數後,指令再跳轉回主函數上繼續執行後面的代碼;而由於內聯函數是將函數的代碼直接放在了函數的位置上,所以沒有指令跳轉,指令按順序執行
3)一般函數的代碼段只有一份,放在內存中的某個位置上,當程序調用它是,指令就跳轉過來;當下一次程序調用它是,指令又跳轉過來;而內聯函數是程序中調用幾次內聯函數,內聯函數的代碼就會複製幾份放在對應的位置上
4)內聯函數一般在頭文件中定義,而一般函數在頭文件中聲明,在cpp中定義
3.利與弊
利:避免了指令的來回跳轉,加快程序執行速度
弊:代碼被多次複製,增加了代碼量,佔用更多的內存空間
4.什麼時候使用內聯函數
1)函數本身內容比較少,代碼比較短,函數功能相對簡單
2)函數被調用得頻繁,不如循環中的函數
5.什麼時候不能使用內聯函數
1)函數代碼量多,功能複雜,體積龐大。對於這種函數,就算加上inline修飾符,系統也不一定會相應,可能還是會當成一般函數處理
2)遞歸函數不能使用內聯函數
6.內聯函數比宏更強大
看一段代碼:
#include <iostream>
using namespace std;
#define SUM(x) x*x
inline int fun(int x)
{
return x * x;
}
int main()
{
int a = SUM(2 + 3);
int b = fun(2 + 3);
cout << "a = " << a << endl;
cout << "b = " << b << endl;
system("pause");
return 0;
}
執行結果:
爲什麼通過宏執行的結果是11呢,宏比較機械和簡單,只是將傳入的參數直接放上去就執行,所以int a = SUM(2 + 3);就相當於int a = 2 + 3 * 2 +3;由於乘法優先級更高,所以得到a的值爲11;而在內聯函數中,傳入的參數是5,所以得到25
爲了得到正確的結果,我們應該將宏改變爲:
#define SUM(x) ((x)*(x))
7.類與內聯函數
1)類內定義的函數都是內聯函數,不管是否有inline修飾符
2)函數聲明在類內,但定義在類外的看是否有inline修飾符,如果有就是內聯函數,否則不是