1. 程式人生 > 實用技巧 >C++入門-行內函數

C++入門-行內函數

舉個例子:

 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4 
 5 #define GETMAX(a, b) ((a) > (b) ? (a) : (b))
 6 
 7 int getMax(int a, int b) { return a > b ? a : b; }
 8 int main(int argc, char const* argv[]) {
 9     int n1 = getMax(1, 3);
10     int n2 = getMax(2
, 4); 11 int n3 = getMax(3, 5); 12 return 0; 13 }

在主函式中多次呼叫getMax,每次呼叫時進入getMax在返回主函式,由於getMax本身的功能比較簡單,造成多次呼叫的開銷比本身函式的計算開銷還要大。

解決方法:

1)使用巨集函式

    int n1 = GETMAX(1, 3);
    int n2 = GETMAX(2, 4);

2)使用行內函數

標頭檔案裡面定義行內函數

inline int getMax(int a, int b) { return a > b ? a : b; }

使用巨集和行內函數都可以節省在函式呼叫方面所帶來的時間和空間開銷。二者都採用了空間換時間的方式,在其呼叫處進行展開:

(1) 在預編譯時期,巨集定義在呼叫處執行字串的原樣替換。在編譯時期,行內函數在呼叫處展開,同時進行引數型別檢查。

(2) 行內函數首先是函式,可以像呼叫普通函式一樣呼叫行內函數。而巨集定義往往需要新增很多括號防止歧義,編寫更加複雜。
(3) 行內函數可以作為某個類的成員函式,這樣可以使用類的保護成員和私有成員。而當一個表示式涉及到類保護成員或私有成員時,巨集就不能實現了(無法將this指標放在合適位置)。


可以用行內函數完全替代巨集
在編寫行內函數時,函式體應該短小而簡潔,不應該包含迴圈等較複雜結構,否則編譯器不會將其當作行內函數看待,而是把它決議成為一個靜態函式。

有些編譯器甚至會優化行內函數,通常為避免一些不必要拷貝和構造,提高工作效率。

頻繁的呼叫行內函數和巨集定義容易造成程式碼膨脹,消耗更大的記憶體而造成過多的換頁操作。