深度解析內聯函數

1.什麼是內聯函數

用關鍵字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修飾符,如果有就是內聯函數,否則不是

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章