原文:https://blog.csdn.net/haitaolang/article/details/69945338 函數
由於函數調用須要開銷(如:保護調用者的運行環境、參數傳遞、執行調用指令等),因此函數調用會帶來程序執行效率的降低,特別是對一些小函數的頻繁調用將是程序的效率有很大的下降。工具
C++提出了兩種解決方法:宏、內聯函數。spa
宏是C++編譯預處理系統處理的實體。經過預處理命令#define來定義。宏定義的4種格式:.net
1)#define口<宏名> 口<文字串>blog
在編譯前進行使用文字串進行宏替換遞歸
#define PI 3.14作用域
2)#define口<宏名>(<參數表>)口<文字串>it
在編譯前進行使用文字串進行宏替換編譯
#define max(a,b) a>b?a:b效率
3)#define口<宏名>
只是告訴編譯程序該宏名已經被定義,不作任何文字串替換,其用於條件編譯
如:#define OUTPUTFILE
#ifdef OUTPUTFILE
//輸出到文件的代碼
#endif
4)#undef口<宏名>
用於取消宏名的編譯,其後的<宏名>再也不進行替換和有定義。
不足:
1)重複計算,如max((x+1),(y+2)),由於編譯預處理會將其替換成:(((x+1)>(y+2))?(x+1):(y+2)),不管(x+1),(y+2)誰大,都會被計算兩次。
2)其只是進行單純的文字替換,不進行參數類型檢查和轉換(如函數調用時,實參和形參類型不一致,若能轉換,編譯程序會進行自動(隱式)類型轉換,不然指出錯誤)。
3)不利於一些工具對程序的處理(如C++程序編譯後,全部宏都不存在了)
內聯函數是指在函數定義中的返回值類型以前加上一個關鍵字 inline,
其做用是建議(具體有沒有不必定,有些函數加上也不會做爲內聯函數對待,如遞歸函數)編譯程序把該函數的函數體展開到調用點,這樣就避免了函數調用的開銷,從而提升了函數調用的效率。
inline int max(int a,int b)
{return a>b?a:b;}
注意:內聯函數名具備文件做用域,故一個文件中定義的內聯函數對於另外一個文件是不可見的。