C++中的内联函数inline总结
C++中的內聯函數inline總結
標簽: c++編譯器vector編程匯編windows 2011-08-26 21:46 13982人閱讀 評論(8) 收藏 舉報 分類: c/c++進行時(28)版權聲明:本文為博主原創文章,未經博主允許不得轉載。
?? ? ?突然看到C++Primer中講到,對于vector的一個循環,調用語句:(示例代碼i=v.begin()不是很規范,雖然不會出錯,客官請將就著看)
[cpp] view plaincopy1、inline的引出
考慮下列min()函數(例子來自C++Primer第三版303頁)
?? ? a.如果一段代碼包含min()的調用,那閱讀這樣的代碼并解釋其含義比讀一個條件操作符的實例,可讀性會強很多。
?? ? b.改變一個局部化的實現比更改一個應用中的300個出現要容易得多
?? ? c.語義是統一的,每個測試都能保證相同的方式實現
?? ? d.函數可以被重用,不必為其他的應用重寫代碼
?? ? 不過,將min()寫成函數有一個嚴重的缺點:調用函數比直接計算條件操作符要慢很多。那怎么能兼顧以上優點和效率呢?C++提供的解決方案為inline(內聯)函數
2、inline的原理:代碼替代
?? ? ? 在程序編譯時,編譯器將程序中出現的內聯函數的調用表達式用內聯函數的函數體來進行替代。
?? ? ? 例如,如果一個函數被指定為inline 函數則它將在程序中每個調用點上被內聯地展開例如
[cpp] view plaincopy
3、inline的使用
?? ? ? 讓一個函數成為內聯函數,隱式的為在類里定義函數,顯式的則是在函數前加上inline關鍵字說明。
4、使用inline的一些注意事項
?? ? ?a.從inline的原理,我們可以看出,inline的原理,是用空間換取時間的做法,是以代碼膨脹(復制)為代價,僅僅省去了函數調用的開銷,從而提高函數的執行效率。如果執行函數體內代碼的時間,相比于函數調用的開銷較大,那么效率的收獲會很少。所以,如果函數體代碼過長或者函數體重有循環語句,if語句或switch語句或遞歸時,不宜用內聯
?? ? ?b.關鍵字inline 必須與函數定義體放在一起才能使函數成為內聯,僅將inline 放在函數聲明前面不起任何作用。內聯函數調用前必須聲明。《高質量C/C++編程》里一個例子。
[cpp] view plaincopy?? ? ? c.inline對于編譯器來說只是一個建議,編譯器可以選擇忽略該建議。換句話說,哪怕真的寫成了inline,也沒有任何錯誤的情況下,編譯器會自動進行優化。所以當inline中出現了遞歸,循環,或過多代碼時,編譯器自動無視inline聲明,同樣作為普通函數調用。
總結下:
?? ? ? 樓主覺得可以將內聯理解為C++中對于函數專有的宏,對于C的函數宏的一種改進。對于常量宏,C++提供const替代;而對于函數宏,C++提供的方案則是inline。在C中,大家都知道宏的優勢,編譯器通過復制宏代碼的方式,省去了參數壓棧,生成匯編的call調用,返回參數等操作,雖然存在一些安全隱患,但在效率上,還是很可取的。
?? ? ? 不過函數宏還是有不少缺陷的,主要有以下:
?? ? ? a.在復制代碼時,容易出現一想不到的邊際效應,比如經典的
[cpp] view plaincopy?? ? c.使用宏,無法訪問類的私有成員
?? ? ?所以,C++ 通過內聯機制,既具備宏代碼的效率,又增加了安全性,還可以自由操作類的數據成員,算是一個比較完美的解決方案。
?? ? ?關于宏,大家還可以參考下:http://dev.yesky.com/260/2095260.shtml,更原創,內容豐富,可取,http://wenku.baidu.com/view/1247bc22192e45361066f564.html總結了各家觀點,稍微整理了下,不過還是蠻清楚的。
?? ? ?就這樣吧,菜鳥goes on ~~~
總結
以上是生活随笔為你收集整理的C++中的内联函数inline总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java web高级编程 百度网盘_[有
- 下一篇: numpy 删除所有为_用Numpy和P