C++ 內聯函數使用

1、inline的引出

考慮下列min()函數(例子來自C++Primer第三版303頁)

  1. int min( int v1, int v2 )  
  2. {  
  3.     return( v1 < v2 << v1 : v2 );  
  4. }  
      爲這樣的小操作定義一個函數的好處是:

     a.如果一段代碼包含min()的調用,那閱讀這樣的代碼並解釋其含義比讀一個條件操作符的實例,可讀性會強很多。

     b.改變一個局部化的實現比更改一個應用中的300個出現要容易得多

     c.語義是統一的,每個測試都能保證相同的方式實現

     d.函數可以被重用,不必爲其他的應用重寫代碼

     不過,將min()寫成函數有一個嚴重的缺點:調用函數比直接計算條件操作符要慢很多。那怎麼能兼顧以上優點和效率呢?C++提供的解決方案爲inline(內聯)函數

2、inline的原理:代碼替代

       在程序編譯時,編譯器將程序中出現的內聯函數的調用表達式用內聯函數的函數體來進行替代。

       例如,如果一個函數被指定爲inline 函數則它將在程序中每個調用點上被內聯地展開例如

  1. int minVal2 = min( i, j );  
在編譯時被展開爲
  1. int minVal2 = i < j << i : j;  
 則把min()寫成函數的額外執行開銷從而被消除了。

3、inline的使用

       讓一個函數成爲內聯函數,隱式的爲在類裏定義函數,顯式的則是在函數前加上inline關鍵字說明。

4、使用inline的一些注意事項

      a.從inline的原理,我們可以看出,inline的原理,是用空間換取時間的做法,是以代碼膨脹(複製)爲代價,僅僅省去了函數調用的開銷,從而提高函數的執行效率。如果執行函數體內代碼的時間,相比於函數調用的開銷較大,那麼效率的收穫會很少。所以,如果函數體代碼過長或者函數體重有循環語句,if語句或switch語句或遞歸時,不宜用內聯

      b.關鍵字inline 必須與函數定義體放在一起才能使函數成爲內聯,僅將inline 放在函數聲明前面不起任何作用。內聯函數調用前必須聲明。《高質量C/C++編程》裏一個例子。

  1. inline void Foo(int x, int y); // inline 僅與函數聲明放在一起  
  2. void Foo(int x, int y)  
  3. {  
  4.     ...  
  5. }  
以上代碼不能成爲內聯函數,而以下則可以

  1. void Foo(int x, int y);  
  2. inline void Foo(int x, int y) // inline 與函數定義體放在一起  
  3. {  
  4.     ...  
  5. }  
       所以說,inline 是一種“用於實現的關鍵字”,而不是一種“用於聲明的關鍵字”。對於以上例子,林銳還建議,只在定義前加上inline,而不是在聲明和定義前都加,因爲這能體現高質量C++/C 程序設計風格的一個基本原則:聲明與定義不可混爲一談。

       c.inline對於編譯器來說只是一個建議,編譯器可以選擇忽略該建議。換句話說,哪怕真的寫成了inline,也沒有任何錯誤的情況下,編譯器會自動進行優化。所以當inline中出現了遞歸,循環,或過多代碼時,編譯器自動無視inline聲明,同樣作爲普通函數調用。


總結下:

       樓主覺得可以將內聯理解爲C++中對於函數專有的宏,對於C的函數宏的一種改進。對於常量宏,C++提供const替代;而對於函數宏,C++提供的方案則是inline。在C中,大家都知道宏的優勢,編譯器通過複製宏代碼的方式,省去了參數壓棧,生成彙編的call調用,返回參數等操作,雖然存在一些安全隱患,但在效率上,還是很可取的。

       不過函數宏還是有不少缺陷的,主要有以下:

       a.在複製代碼時,容易出現一想不到的邊際效應,比如經典的

  1. #define MAX(a, b) (a) > (b) ? (a) : (b)  
在執行語句:
  1. result = MAX(i, j) + 2 ;  
時,會被解釋爲

  1. result = (i) > (j) ? (i) : (j) + 2 ;  
     b.使用宏,無法進行調試,雖然windows提供了ASSERT宏

     c.使用宏,無法訪問類的私有成員
      所以,C++ 通過內聯機制,既具備宏代碼的效率,又增加了安全性,還可以自由操作類的數據成員,算是一個比較完美的解決方案。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章