C++内聯函數詳解
1.函數調用原理
"編譯過程的最終産品是可執行程式--由一組機器語言指令組成。運作程式時,作業系統将這些指令載入計算機記憶體中,是以每條指令都有特定的記憶體位址。計算機随後将逐漸執行這些指令。有時(如有循環和分支語句時),将跳過一些指令,向前或向後跳到特定位址。正常函數調用也使程式跳到另一個位址(函數的位址),并在函數結束時傳回。下面更詳細地介紹這一過程的典型實作。執行到函數調用指令時,程式将在函數調用後立即存儲該指令的記憶體位址,并将函數參數複制到堆棧(為此保留的記憶體塊),跳到标記函數起點的記憶體單元,執行函數代碼(也許還需将傳回值放入寄存器中),然後跳回到位址被儲存的指令處(這與閱讀文章時停下來看腳注,并在閱讀完腳注後傳回到以前閱讀的地方類似)。來回跳躍并記錄跳躍位置意味着以前使用函數時,需要一定的開銷。"
2.内聯函數
内聯函數提供了另一種選擇。編譯器将使用相應的函數代碼替換函數調用。是以,内聯函數的運作速度比正常函數稍快,但代價是需要占用更多記憶體。
3.内聯函數的使用
在函數聲明前加上關鍵字inline;
在函數定義前加上關鍵字inline。
示例如下:
程式輸出結果如下:
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