C++內聯函數
對常規函數的調用對應着跳轉到標記函數起點的內存單元,然後執行函數代碼,執行完畢後跳回到地址被保存的命令處。
來回跳躍並記錄跳躍位置是需要一定開銷的。
C++提供的內聯函數與常規函數不同,內聯函數在編譯階段就將函數代碼與調用者內聯起來了,也就是使用函數代碼替換了
函數的調用,從而實現較快的執行速度,但是代價是需要額外的存儲空間。使用方式爲
在函數聲明前加上關鍵字inline;
在函數定以前加上關鍵字inline。
什麼時候考慮使用內聯函數:
(內聯函數不需要出入棧,效率上會好點,但編譯後的text段會大一點)
使用高度頻繁,而且操作內容簡單的情況下,用inline函數。這是C++爲了取代宏定義而設置的函數。
內聯函數具有一般函數的特性,它與一般函數的不同之處只在於函數調用上的處理:
一般函數進行調用時,要將程序執行權轉到被調用函數中,然後再返回到調用它的函數中;而內聯函數在調用時,是將調用表達式用內聯函數體來替換。
在使用內聯函數時,應注意如下幾點:
1.在內聯函數內不允許用循環語句和開關自語句。
如果內聯函數有這些語句,則編譯將該函數視同普通函數那樣產生函數調用代碼百,遞歸函數(自己調用自己的函數)是不能被用來做內聯函數的。
2.內聯函數只適合於只有1~5行的小函數。對一個含有許多語句的大函數,函數調用和返回的開銷相對來說微不足道,所以也沒有必要用內聯函數實現。
3.內聯函數的定義必須出現在內聯函數第一次被調用之前。
#include <iostream>
using namespace std;
inline void Say();
int main()
{
Say();
return 0;
}
inline void Say()
{
cout << "Hello,KuGou!" << endl;
}
但通常的做法是省略函數原型,將整個定義放在本應提供原型的地方:
#include <iostream>
using namespace std;
inline void Say() { cout << "Hello,KuGou!" << endl; }
int main()
{
Say();
return 0;
}