C++深入之內聯函數

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章