宏和內聯函數

原文:https://blog.csdn.net/haitaolang/article/details/69945338 函數

  由於函數調用須要開銷(如:保護調用者的運行環境、參數傳遞、執行調用指令等),因此函數調用會帶來程序執行效率的降低,特別是對一些小函數的頻繁調用將是程序的效率有很大的下降。工具

  C++提出了兩種解決方法:宏、內聯函數。spa

1. 宏

    宏是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++程序編譯後,全部宏都不存在了

2. 內聯函數

  內聯函數是指在函數定義中的返回值類型以前加上一個關鍵字 inline,

其做用是建議(具體有沒有不必定,有些函數加上也不會做爲內聯函數對待,如遞歸函數)編譯程序把該函數的函數體展開到調用點,這樣就避免了函數調用的開銷,從而提升了函數調用的效率。

  inline int max(int a,int b)

  {return a>b?a:b;}

  注意:內聯函數名具備文件做用域,故一個文件中定義的內聯函數對於另外一個文件是不可見的。

相關文章
相關標籤/搜索