日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++中的内联函数inline总结

發布時間:2025/3/15 c/c++ 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++中的内联函数inline总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

C++中的內聯函數inline總結

標簽: c++編譯器vector編程匯編windows 13982人閱讀 評論(8) 收藏 舉報 分類: c/c++進行時(28)

?? ? ?突然看到C++Primer中講到,對于vector的一個循環,調用語句:(示例代碼i=v.begin()不是很規范,雖然不會出錯,客官請將就著看)

[cpp] view plaincopy
  • for?(int?i=v.begin()?;?i<v.size()?;?i++)??
  • {??
  • ????....??
  • }??
  • ?? ? ? 對于size()的調用,其實是內聯。想到以前貌似是看《高質量C/C++編程》時,提過,在循環時,可以采用變量保存v.size()的值,以減少每個循環的調用開支。于是決定一搜,順便總結之。

    1、inline的引出

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

    [cpp] view plaincopy
  • int?min(?int?v1,?int?v2?)??
  • {??
  • ????return(?v1?<?v2?<<?v1?:?v2?);??
  • }??
  • ?? ? ?為這樣的小操作定義一個函數的好處是:

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

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

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

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

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

    2、inline的原理:代碼替代

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

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

    [cpp] view plaincopy
  • int?minVal2?=?min(?i,?j?);??
  • 在編譯時被展開為
    [cpp] view plaincopy
  • int?minVal2?=?i?<?j?<<?i?:?j;??
  • ?則把min()寫成函數的額外執行開銷從而被消除了。

    3、inline的使用

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

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

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

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

    [cpp] view plaincopy
  • inline?void?Foo(int?x,?int?y);?//?inline?僅與函數聲明放在一起??
  • void?Foo(int?x,?int?y)??
  • {??
  • ????...??
  • }??
  • 以上代碼不能成為內聯函數,而以下則可以 [cpp] view plaincopy
  • void?Foo(int?x,?int?y);??
  • inline?void?Foo(int?x,?int?y)?//?inline?與函數定義體放在一起??
  • {??
  • ????...??
  • }??
  • ?? ? ? 所以說,inline 是一種“用于實現的關鍵字”,而不是一種“用于聲明的關鍵字”。對于以上例子,林銳還建議,只在定義前加上inline,而不是在聲明和定義前都加,因為這能體現高質量C++/C 程序設計風格的一個基本原則:聲明與定義不可混為一談。

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


    總結下:

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

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

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

    [cpp] view plaincopy
  • #define?MAX(a,?b)?(a)?>?(b)???(a)?:?(b)??
  • 在執行語句: [cpp] view plaincopy
  • result?=?MAX(i,?j)?+?2?;??
  • 時,會被解釋為 [cpp] view plaincopy
  • result?=?(i)?>?(j)???(i)?:?(j)?+?2?;??
  • ?? ? b.使用宏,無法進行調試,雖然windows提供了ASSERT宏

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

    ?? ? ?關于宏,大家還可以參考下:http://dev.yesky.com/260/2095260.shtml,更原創,內容豐富,可取,http://wenku.baidu.com/view/1247bc22192e45361066f564.html總結了各家觀點,稍微整理了下,不過還是蠻清楚的。


    ?? ? ?就這樣吧,菜鳥goes on ~~~

    總結

    以上是生活随笔為你收集整理的C++中的内联函数inline总结的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。