Pages

2011年9月28日 星期三

inline




inline 這個關鍵字是使用在function前面
inline
所宣告的function並不會有程式本體
而是像巨集(define)一樣 會直接展開到呼叫他的地方
inline的優點
在類別(class) 我們常需要使用一個function將一個變數傳出去 比方說

int CMyClass::GetValue()
{
  return m_nValue;
}


我們知道 function的呼叫 是非常花CPU時間的 function裡面卻只有傳回一個數值而已
這樣的動作 對於CPU的使用非常沒有效率 
當然 我們可以將這個變數改成public 讓其他人直接來存取
不過這是一個不好的寫法
比較好的寫法是使用inline function 來解決這個問題
經過inline所宣告的function會直接展開在程式碼內
所編出來程式碼就會直接去存取那個參數 省略了呼叫function的時間浪費

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

inline int 
I_TRIPLE(int n)
{

  return
 n+n+n;
}

void main()
{
  int a = 1;
  int b = 1;

  int r1 = D_TRIPLE(GetValue());
  int r2 = I_TRIPLE(GetValue());
}


r1是使用巨集 他會將GetValue()展開到程式碼中三次 如此r1是將三次呼叫GetValue()的值相加
r2
是使用inline function他只會呼叫GetValue()一次 之後便將這個值相加起來(三個相加)

inline的使用
inline
的使用非常簡單 只需要在function宣告前加上inline即可(如前面範例所示)
另外 如果將function的內容直接寫在類別(class)宣告中的話 編譯器會直接把他當做inline
例如
class CMyClass
{
  int m_nValue;

  int GetValue()
  {
    return m_nValue;
  };
}

以上的GetValue()並沒有宣告成inline 但是編譯器還是會直接將他當作inline function

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

沒有留言:

張貼留言