C++_inline行內函數
阿新 • • 發佈:2019-02-04
inline行內函數可以實現在呼叫函式的地方拷貝程式碼副本,從而避免了函式呼叫跳轉等存在的時間上耗時稍長的問題。
(inline 要寫在函式 定義 與 宣告 之前,如 inline double square(double);
inline double square(double x){return x*x;})
行內函數的使用前提:
1.程式碼段比較小
2.且函式呼叫頻繁的程式碼可以使用行內函數,行內函數安全性比巨集函式更好。
不會出現語義上的問題,而巨集函式會出現語義上的問題(尤其對於自增運算子):詳見我的博文
傳送門:http://blog.csdn.net/u010003835/article/details/47394867
例如#define SQUARE(x) ((x)*(x))
當呼叫SQUARE(++C) 得到結果為49
呼叫前C等於5,呼叫後C等於7,與語義違背。
但是行內函數也存在一些問題:
例如行內函數要進行函式的型別宣告與引數型別的宣告,可能要重寫多個行內函數。
注意:遞迴呼叫的函式不應宣告為行內函數。
行內函數不要呼叫自身,可以通過編譯。但這樣由於函式複製會導致(程式碼的隱含長度大大增長)不值得這麼做。
行內函數如何使用:
1.inline要加在函式宣告的前面。
2.inline要加在函式定義的前面.
示例:
#include <iostream> using namespace std; #define SQUARE(X) ((X)*(X)) inline int fabs(int i); inline double square(double x){ return x*x; } int main(){ int a = 5; /* cout << SQUARE(3.5 + 1.5) << endl; cout << SQUARE(a++) << endl; cout << a << endl; */ cout << fabs(10) << endl; cout << square(++a) << endl; cout << a << endl; return 0; }
fabs雖然定義為了行內函數且通過了編譯可以執行,但是inline由於進行的是函式體的複製,會導致程式碼長度大大增加,所以不應將遞迴呼叫的函式宣告為行內函數。