1. 程式人生 > >巨集和行內函數

巨集和行內函數

原文: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;}

  注意:行內函數名具有檔案作用域,故一個檔案中定義的行內函數對於另一個檔案是不可見的。