巨集和行內函數
原文:https://blog.csdn.net/haitaolang/article/details/69945338
因為函式呼叫需要開銷(如:保護呼叫者的執行環境、引數傳遞、執行呼叫指令等),所以函式呼叫會帶來程式執行效率的下降,特別是對一些小函式的頻繁呼叫將是程式的效率有很大的降低。
C++提出了兩種解決方法:巨集、行內函數。
1. 巨集
巨集是C++編譯預處理系統處理的實體。通過預處理命令#define來定義。巨集定義的4種格式:
1)#define口<巨集名> 口<文字串>
在編譯前進行使用文字串進行巨集替換
#define PI 3.14
2)#define口<巨集名>(<引數表>)口<文字串>
在編譯前進行使用文字串進行巨集替換
#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++程式編譯後,所有巨集都不存在了
2. 行內函數
行內函數是指在函式定義中的返回值型別之前加上一個關鍵字 inline,
其作用是建議(具體有沒有不一定,有些函式加上也不會作為行內函數對待,如遞迴函式)編譯程式把該函式的函式體展開到呼叫點,這樣就避免了函式呼叫的開銷,從而提高了函式呼叫的效率。
inline int max(int a,int b)
{return a>b?a:b;}
注意:行內函數名具有檔案作用域,故一個檔案中定義的行內函數對於另一個檔案是不可見的。