2011年2月16日 星期三

[C++ 小學堂] 關鍵字 inline 介紹


轉載自 這裡
inline 這個關鍵字是使用在function前面. 而inline 所宣告的function並不會有程式本體, 而是像巨集(define)一樣 會直接展開到呼叫他的地方.

inline的優點 :
在類別(class)中 我們常需要使用一個function將一個變數傳出去 比方說 :
  1. int CMyClass::GetValue()  
  2. {  
  3.   return m_nValue;  
  4. }  
我們知道 function的呼叫 是非常花CPU時間的 而function裡面卻只有傳回一個數值而已. 這樣的動作 對於CPU的使用非常沒有效率 . 當然 我們可以將這個變數改成public 讓其他人直接來存取. 不過這是一個不好的寫法, 比較好的寫法是使用inline function 來解決這個問題. 經過inline所宣告的function會直接展開在程式碼內, 所編出來程式碼就會直接去存取那個參數 省略了呼叫function的時間浪費.

inline與#define的比較 :
inline 其實就是將一個function直接展開到程式碼內. 這樣的功能 透過巨集也可以達到 不過巨集跟inline還是有些差異的 :
1. 巨集當然不可能將public以外的變數傳出去 inline可以
2. 巨集跟inline有時候結果會不同.

如下所示 :
  1. #define D_TRIPLE(n) (n+n+n)  
  2.   
  3. int GetValue();  
  4.   
  5. inline int I_TRIPLE(int n)  
  6. {  
  7.   return n+n+n;  
  8. }  
  9.   
  10. void main()  
  11. {  
  12.   int a = 1;  
  13.   int b = 1;  
  14.   
  15.   int r1 = D_TRIPLE(GetValue());  
  16.   int r2 = I_TRIPLE(GetValue());  
  17. }  
r1是使用巨集 他會將GetValue()展開到程式碼中三次 如此r1是將三次呼叫GetValue()的值相加
r2是使用inline function他只會呼叫GetValue()一次 之後便將這個值相加起來(三個相加).

inline的使用 :
inline的使用非常簡單 只需要在function宣告前加上inline即可(如前面範例所示). 另外 如果將function的內容直接寫在類別(class)宣告中的話 編譯器會直接把他當做inline. 例如 :
  1. class CMyClass  
  2. {  
  3.   int m_nValue;  
  4.   
  5.   int GetValue()  
  6.   {  
  7.     return m_nValue;  
  8.   };  
  9. }  
以上的GetValue()並沒有宣告成inline 但是編譯器還是會直接將他當作inline function!

inline的使用效益問題 :
最後 一個function是否要用inline來展開的決定權 還是在編譯器手上. 編譯器會自己評估 將這個function用inline來展開合不合效益, 如果說程式碼很長 使用inline並不能節省多少CPU時間 然後卻又被呼叫很多次. 編譯器會判斷不合效益 則會自動忽略掉inline.

補充說明 :
C++ Gossip: 行內函式(Inline function)
在 函式簡介 中的範例,有一個pow2()函式:
  1. int pow2(int num) {   
  2.     return num*num;   
  3. }  
在呼叫函式時會需要分配記憶空間因而需要額外的資源負擔,像pow2()這樣的小函式,可以「建議」編譯器將之設定為「行內函式」(Inline function),如果建議被採納,則該函式會自動在呼叫點展現為程式碼,行內函式建議可以直接定義於表頭檔案中...
This message was edited 3 times. Last update was at 16/02/2011 23:31:47

沒有留言:

張貼留言

[Git 常見問題] error: The following untracked working tree files would be overwritten by merge

  Source From  Here 方案1: // x -----删除忽略文件已经对 git 来说不识别的文件 // d -----删除未被添加到 git 的路径中的文件 // f -----强制运行 #   git clean -d -fx 方案2: 今天在服务器上  gi...