C++內聯函數詳解



1.函數調用原理

"編譯過程的最終產品是可執行程序--由一組機器語言指令組成。運行程序時,操作系統將這些指令載入計算機內存中,因此每條指令都有特定的內存地址。計算機隨后將逐步執行這些指令。有時(如有循環和分支語句時),將跳過一些指令,向前或向后跳到特定地址。常規函數調用也使程序跳到另一個地址(函數的地址),並在函數結束時返回。下面更詳細地介紹這一過程的典型實現。執行到函數調用指令時,程序將在函數調用后立即存儲該指令的內存地址,並將函數參數復制到堆棧(為此保留的內存塊),跳到標記函數起點的內存單元,執行函數代碼(也許還需將返回值放入寄存器中),然后跳回到地址被保存的指令處(這與閱讀文章時停下來看腳注,並在閱讀完腳注后返回到以前閱讀的地方類似)。來回跳躍並記錄跳躍位置意味着以前使用函數時,需要一定的開銷。"

2.內聯函數
內聯函數提供了另一種選擇。編譯器將使用相應的函數代碼替換函數調用。因此,內聯函數的運行速度比常規函數稍快,但代價是需要占用更多內存。

3.內聯函數的使用
在函數聲明前加上關鍵字inline;
在函數定義前加上關鍵字inline。
示例如下:

#include<iostream>
inline double square(double x){return x*x;}
int main()
{
    using namespace std;
    double a,b;
    double c = 13.0;
    a = square(5.0);
    b = square(4.5+7.5);
    cout<<"a="<<a<<",b="<<b<<endl;
    cout<<"c="<<c<<endl;
    cout<<"c squared="<<square(c++)<<endl;
    cout<<"now c="<<c<<endl;
    return 0;
}

程序輸出結果如下:
a=25,b=144
c=13
c square=169
now c=14

4.內聯函數與宏定義的區別
C語言使用預處理器語句#define來提供宏。如下例所示:
#define SQUARE(X) X*X
宏定義時通過文本替換開實現的--X是參數的符號標記。
a = square(5.0);->a=5.0*5.0;
b = square(4.5+7.5);->b=4.5+7.5*4.5+7.5
d = square(c++);->d=c++*c++
可以看出,對於b,需要使用括號才能正常運算。
#define SQUARE(X) ((X)*(X))
對於c,卻仍遞增了兩次。
因此,宏定義和內聯函數存在本質的區別,轉換的時候應考慮是否轉換后功能是否正常

5.什么時候使用內聯函數
如果執行函數代碼的時間比處理函數調用機制的時間長,則節省的時間占比很小。若代碼執行時間很短,則內聯函數就可以節省函數調用的時間。

 

參考資料:《C++ Primer.Plus》 pp.253-255

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM