函數(shù)內(nèi)聯(lián)

成都創(chuàng)新互聯(lián)擁有網(wǎng)站維護技術(shù)和項目管理團隊,建立的售前、實施和售后服務(wù)體系,為客戶提供定制化的網(wǎng)站設(shè)計、成都網(wǎng)站設(shè)計、網(wǎng)站維護、遂寧聯(lián)通機房解決方案。為客戶網(wǎng)站安全和日常運維提供整體管家式外包優(yōu)質(zhì)服務(wù)。我們的網(wǎng)站維護服務(wù)覆蓋集團企業(yè)、上市公司、外企網(wǎng)站、商城網(wǎng)站建設(shè)、政府網(wǎng)站等各類型客戶群體,為全球數(shù)千家企業(yè)提供全方位網(wǎng)站維護、服務(wù)器維護解決方案。
用內(nèi)聯(lián)取代宏代碼
----------------
C++
語言支持函數(shù)內(nèi)聯(lián),其目的是為了提高函數(shù)的執(zhí)行效率(速度)。
在C程序中,可以用宏代碼提高執(zhí)行效率。宏代碼本身不是函數(shù),但使用起來象函數(shù)。
預(yù)處理器用復(fù)制宏代碼的方式代替函數(shù)調(diào)用,省去了參數(shù)壓棧、生成匯編語言的CALL調(diào)用、
返回參數(shù)、執(zhí)行return等過程,從而提高了速度。
使用宏代碼最大的缺點是容易出錯,預(yù)處理器在復(fù)制宏代碼時常常產(chǎn)生意想不到的邊際效應(yīng)。
對于C++
而言,使用宏代碼還有另一種缺點:無法操作類的私有數(shù)據(jù)成員。
讓我們看看C++
的"函數(shù)內(nèi)聯(lián)"是如何工作的。
對于任何內(nèi)聯(lián)函數(shù),編譯器在符號表里放入函數(shù)的聲明(包括名字、參數(shù)類型、返回值類型)。
如果編譯器沒有發(fā)現(xiàn)內(nèi)聯(lián)函數(shù)存在錯誤,那么該函數(shù)的代碼也被放入符號表里。
在調(diào)用一個內(nèi)聯(lián)函數(shù)時,編譯器首先檢查調(diào)用是否正確
(進行類型安全檢查,或者進行自動類型轉(zhuǎn)換,當(dāng)然對所有的函數(shù)都一樣)。
如果正確,內(nèi)聯(lián)函數(shù)的代碼就會直接替換函數(shù)調(diào)用,于是省去了函數(shù)調(diào)用的開銷。
這個過程與預(yù)處理有顯著的不同,因為預(yù)處理器不能進行類型安全檢查,或者進行自動類型轉(zhuǎn)換。
假如內(nèi)聯(lián)函數(shù)是成員函數(shù),對象的地址(this)會被放在合適的地方,這也是預(yù)處理器辦不到的。
C++
語言的函數(shù)內(nèi)聯(lián)機制既具備宏代碼的效率,又增加了安全性,而且可以自由操作類的數(shù)據(jù)成員。
所以在C++
程序中,應(yīng)該用內(nèi)聯(lián)函數(shù)取代所有宏代碼,"斷言assert"恐怕是唯一的例外。
assert是僅在Debug版本起作用的宏,它用于檢查"不應(yīng)該"發(fā)生的情況。
為了不在程序的Debug版本和Release版本引起差別,assert不應(yīng)該產(chǎn)生任何副作用。
如果assert是函數(shù),由于函數(shù)調(diào)用會引起內(nèi)存、代碼的變動,那么將導(dǎo)致Debug版本與Release版本存在差異。
所以assert不是函數(shù),而是宏。
引入內(nèi)聯(lián)函數(shù)的目的是為了解決程序中函數(shù)調(diào)用的效率問題。
函數(shù)是一種更高級的抽象。它的引入使得編程者只關(guān)心函數(shù)的功能和使用方法,而不必關(guān)心函數(shù)功能的具體實現(xiàn);函數(shù)的引入可以減少程序的目標(biāo)代碼,實現(xiàn)程序代碼和數(shù)據(jù)的共享。但是,函數(shù)調(diào)用也會帶來降低效率的問題,因為調(diào)用函數(shù)實際上將程序執(zhí)行順序轉(zhuǎn)移到函數(shù)所存放在內(nèi)存中某個地址,將函數(shù)的程序內(nèi)容執(zhí)行完后,再返回到轉(zhuǎn)去執(zhí)行該函數(shù)前的地方。這種轉(zhuǎn)移操作要求在轉(zhuǎn)去前要保護現(xiàn)場并記憶執(zhí)行的地址,轉(zhuǎn)回后先要恢復(fù)現(xiàn)場,并按原來保存地址繼續(xù)執(zhí)行。因此,函數(shù)調(diào)用要有一定的時間和空間方面的開銷,于是將影響其效率。特別是對于一些函數(shù)體代碼不是很大,但又頻繁地被調(diào)用的函數(shù)來講,解決其效率問題更為重要。引入內(nèi)聯(lián)函數(shù)實際上就是為了解決這一問題。
在程序編譯時,編譯器將程序中出現(xiàn)的內(nèi)聯(lián)函數(shù)的調(diào)用表達式用內(nèi)聯(lián)函數(shù)的函數(shù)體來進行替換。顯然,這種做法不會產(chǎn)生轉(zhuǎn)去轉(zhuǎn)回的問題,但是由于在編譯時將函數(shù)休中的代碼被替代到程序中,因此會增加目標(biāo)程序代碼量,進而增加空間開銷,而在時間代銷上不象函數(shù)調(diào)用時那么大,可見它是以目標(biāo)代碼的增加為代價來換取時間的節(jié)省。
優(yōu)點是提高運行時間效率,缺點是增加了空間開銷
對于普通函數(shù),函數(shù)調(diào)用需要時間和空間開銷,調(diào)用函數(shù)實際上將程序執(zhí)行流程轉(zhuǎn)移到被調(diào)函數(shù)中,被調(diào)函數(shù)的代碼執(zhí)行完后,再返回到調(diào)用的地方。這種調(diào)用操作要求調(diào)用前保護好現(xiàn)場并記憶執(zhí)行的地址,返回后恢復(fù)現(xiàn)場,并按原來保存的地址繼續(xù)執(zhí)行。對于較長的函數(shù)這種開銷可以忽略不計,但對于一些函數(shù)體代碼很短,又被頻繁調(diào)用的函數(shù),就不能忽視這種開銷。引入內(nèi)聯(lián)函數(shù)正是為了解決這個問題,提高程序的運行效率。
對于內(nèi)聯(lián)函數(shù),在程序編譯時,編譯器將程序中出現(xiàn)的內(nèi)聯(lián)函數(shù)的調(diào)用表達式用內(nèi)聯(lián)函數(shù)的函數(shù)體來進行替換。由于在編譯時將內(nèi)聯(lián)函數(shù)體中的代碼替代到程序中,因此會增加目標(biāo)程序代碼量,進而增加空間開銷,而在時間開銷上不象函數(shù)調(diào)用時那么大,可見它是以目標(biāo)代碼的增加為代價來換取時間的節(jié)省。
本文題目:c語言內(nèi)聯(lián)函數(shù)優(yōu)點,簡述內(nèi)聯(lián)函數(shù)的定義以及優(yōu)缺點
文章網(wǎng)址:http://chinadenli.net/article15/dsshggi.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、面包屑導(dǎo)航、品牌網(wǎng)站設(shè)計、用戶體驗、網(wǎng)站制作、
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)