close

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

arrow
arrow
    全站熱搜

    createps 發表在 痞客邦 留言(1) 人氣()