inline函数学习笔记
一、c++ inline函數(shù)產(chǎn)生原因
由于函數(shù)調(diào)用會有一定的時(shí)間和空間方面的開銷,特別是對于一些函數(shù)體代碼不大但又被頻繁調(diào)用的函數(shù)來講,效率是很低的。
在C語言中,可以用宏函數(shù)來提高上面那種情況的效率,但宏函數(shù)有些缺點(diǎn),它只是提供一個文本替換的功能,而不是一個真正的函數(shù)。所以在C++中引入了inline函數(shù)來解決這個問題,它會像宏函數(shù)一樣在調(diào)用函數(shù)處用內(nèi)聯(lián)函數(shù)體的代碼進(jìn)行替換,還遵循函數(shù)的類型和作用域規(guī)則,所以它能像一般的函數(shù)那樣進(jìn)行調(diào)用和調(diào)試。
二、如何定義inline函數(shù)
inline函數(shù)只有和函數(shù)體定義放在一起是才有效,所以如果像這樣聲明一個內(nèi)聯(lián)函數(shù)
那么在編譯器看來,它與普通函數(shù)沒有兩樣,如下所示
這樣它才具有比一般函數(shù)更快的執(zhí)行能力。
還有一種定義方式是在類內(nèi)部定義的函數(shù)。在c++中,如果在類內(nèi)部定義了函數(shù)體的函數(shù),則默認(rèn)其為內(nèi)聯(lián),而不管是否有inline關(guān)鍵字。所以像如下兩個函數(shù)Func1、Func2都屬于內(nèi)聯(lián)。
當(dāng)然,內(nèi)聯(lián)函數(shù)并不是萬能的,在某些情況下,它不僅不能像期望的那樣提升性能,甚至?xí)鸱醋饔谩nline只是對編譯器的一種提示,而不是命令。也就是說,只要編譯器愿意,它就可以隨意地忽略掉你的指令,當(dāng)編譯器遇到內(nèi)聯(lián)函數(shù)時(shí),就會針對函數(shù)體的上下文進(jìn)行優(yōu)化,以確定是否執(zhí)行內(nèi)聯(lián)。如果編譯器認(rèn)為當(dāng)前的函數(shù)過于復(fù)雜、函數(shù)體過大,或者這個函數(shù)是虛函數(shù),就會拒絕將其內(nèi)聯(lián),這取決與編譯器,不同編譯器處理方式不一樣。
三、在使用inline時(shí),需注意如下幾點(diǎn):
1、在inline函數(shù)內(nèi)不允許用循環(huán)語句和開關(guān)語句,函數(shù)體不能過于復(fù)雜;
2、對于內(nèi)存空間有限的機(jī)器而言,慎用內(nèi)聯(lián)。過分使用內(nèi)聯(lián)會造成函數(shù)代碼過于膨脹,會占用太多空間;
3、不能對構(gòu)造或者析構(gòu)函數(shù)進(jìn)行內(nèi)聯(lián),盡管它們看似很簡短。對于這一點(diǎn)看下面這個類Derived的構(gòu)造函數(shù):
這個構(gòu)造函數(shù)看起來的確是個內(nèi)聯(lián)的好材料,因?yàn)樗鼪]有代碼,實(shí)際上,它含有相當(dāng)多的代碼。對于上面這個空的Derived的構(gòu)造函數(shù),有些編譯器會為它產(chǎn)生相當(dāng)于下面的代碼:
如果string的構(gòu)造函數(shù)也恰巧被內(nèi)聯(lián),Derived的構(gòu)造函數(shù)將得到其代碼的5個拷貝(2個繼承而來,3個自己聲明)。現(xiàn)在你應(yīng)該明白,內(nèi)聯(lián)Derived的構(gòu)造函數(shù)并非可以很簡單就決定的;類似的情況也適用于析構(gòu)。
4、內(nèi)聯(lián)函數(shù)只適合于只有1~5行的小函數(shù)。
四、內(nèi)聯(lián)還得面臨2個頭疼的問題
第一,該如何維護(hù)?一個函數(shù)開始的時(shí)候可能滿足了設(shè)定的內(nèi)聯(lián)標(biāo)準(zhǔn),并以內(nèi)聯(lián)的形式出現(xiàn),但隨著系統(tǒng)的擴(kuò)展升級,函數(shù)體中增添了一些新功能,函數(shù)體變得復(fù)雜了,這就使內(nèi)聯(lián)函數(shù)不再適合內(nèi)聯(lián),此時(shí)需要把函數(shù)前面的inline去掉,并把函數(shù)體放到相應(yīng)的源文件中,這會使維護(hù)的難度有所增加。
第二,不可避免的重新編譯。當(dāng)內(nèi)聯(lián)函數(shù)實(shí)現(xiàn)改變的時(shí)候,用戶必須重新編譯他們的代碼以反映出這種改變。而對于非內(nèi)聯(lián)函數(shù),我們僅僅需要重新鏈接。
所以,使用inline需要依靠積累的經(jīng)驗(yàn)來進(jìn)行判斷,合理正確的使用內(nèi)聯(lián),可以提高程序的性能,反之,會帶來意想不到的副作用!
轉(zhuǎn)載于:https://blog.51cto.com/rainseason/808950
總結(jié)
以上是生活随笔為你收集整理的inline函数学习笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux系统基础网络配置老鸟精华篇
- 下一篇: 权限设计中的数据灵活存储设计策略参考[以