define 與 inline

define

  就是代碼替換,在編譯階段進行簡單的代碼替換,大量用於宏定義開關,以及定義表達式和常量,如:函數

1.開關定義

  #define CONFIG_OPENEDurl

  使用:get

  #ifdef CONGFIG_OPENED編譯器

  .....io

  #else編譯

  .....效率

  #endif百度

 

2.常量定義

  #define NAME "TEST"im

  使用:di

  printf("the name is %s", NAME);

 

  #define HAVE_DONE 1

  使用:

  if(HAVE_DONE) {

  } else {

  }

 

3.表達式定義

  #define ExpressionName(Var1,Var2) ((Var1)+(Var2))*((Var1)-(Var2))

  使用:

  int m = ExpressionName(5,6); 

  講一下最後這種表達式定義的使用方式,其特色就是代碼替換,使用的地方簡介明瞭,由於是編譯階段替換,因此不會像普通函數調用那樣,涉及到參數的出棧入棧,效率就高;但這種使用方式也有問題,這種宏定義在形式上相似於一個函數,但在使用它時,僅僅只是作預處理器符號表中的簡單替換,所以它不能進行參數有效性的檢測,也就不能享受C++編譯器嚴格類型檢查的好處,另外它的返回值也不能被強制轉換爲可轉換的合適的類型,這樣,它的使用就存在着一系列的隱患和侷限性。爲此,在C++中,就引入了inline關鍵字,內聯函數(內嵌函數)。

inline

內聯函數有下面幾個特色:

  1. inline 定義的類的內聯函數,函數的代碼被放入符號表中,在使用時直接進行替換,(像宏同樣直接進行替換展開),沒有了調用的開銷,效率也很高。
  2. 很明顯,類的內聯函數也是一個真正的函數,編譯器在調用一個內聯函數時,會首先檢查它的參數的類型,保證調用正確。而後進行一系列的相關檢查,就像對待任何一個真正的函數同樣。這樣就消除了它的隱患和侷限性。
  3. inline 能夠做爲某個類的成員函數,固然就能夠在其中使用所在類的保護成員及私有成員。

  在什麼時候使用inline函數:
  首先,你可使用inline函數徹底取表明達式形式的宏定義。
  另外要注意,內聯函數通常只會用在函數內容很是簡單的時候,這是由於,內聯函數的代碼會在任何調用它的地方展開,若是函數太複雜,代碼膨脹帶來的惡果極可能會大於效率的提升帶來的益處。內聯函數最重要的使用地方是用於類的存取函數。

 

Reference

      百度百科:inline

相關文章
相關標籤/搜索