主要用來處理 短小精悍且調(diào)用次數(shù)多的代碼封裝成為內(nèi)聯(lián)函數(shù)
static inline CGFloat const mainScreenHeight(){
return [UIScreen mainScreen].bounds.size.height;
}
引入內(nèi)聯(lián)函數(shù)的目的是為了解決程序中函數(shù)調(diào)用的效率問題。
函數(shù)是一種更高級(jí)的抽象。它的引入使得編程者只關(guān)心函數(shù)的功能和使用方法取胎,而不必關(guān)心函數(shù)功能的具體實(shí)現(xiàn);函數(shù)的引入可以減少程序的目標(biāo)代碼,實(shí)現(xiàn)程序代碼和數(shù)據(jù)的共享顽耳。但是坠敷,函數(shù)調(diào)用也會(huì)帶來降低效率的問題,因?yàn)檎{(diào)用函數(shù)實(shí)際上將程序執(zhí)行順序轉(zhuǎn)移到函數(shù)所存放在內(nèi)存中某個(gè)地址射富,將函數(shù)的程序內(nèi)容執(zhí)行完后膝迎,再返回到轉(zhuǎn)去執(zhí)行該函數(shù)前的地方。這種轉(zhuǎn)移操作要求在轉(zhuǎn)去前要保護(hù)現(xiàn)場并記憶執(zhí)行的地址胰耗,轉(zhuǎn)回后先要恢復(fù)現(xiàn)場限次,并按原來保存地址繼續(xù)執(zhí)行。因此柴灯,函數(shù)調(diào)用要有一定的時(shí)間和空間方面的開銷卖漫,于是將影響其效率。特別是對(duì)于一些函數(shù)體代碼不是很大赠群,但又頻繁地被調(diào)用的函數(shù)來講羊始,解決其效率問題更為重要。引入內(nèi)聯(lián)函數(shù)實(shí)際上就是為了解決這一問題查描。
在程序編譯時(shí)突委,編譯器將程序中出現(xiàn)的內(nèi)聯(lián)函數(shù)的調(diào)用表達(dá)式用內(nèi)聯(lián)函數(shù)的函數(shù)體來進(jìn)行替換。顯然冬三,這種做法不會(huì)產(chǎn)生轉(zhuǎn)去轉(zhuǎn)回的問題匀油,但是由于在編譯時(shí)將函數(shù)休中的代碼被替代到程序中,因此會(huì)增加目標(biāo)程序代碼量勾笆,進(jìn)而增加空間開銷敌蚜,而在時(shí)間代銷上不象函數(shù)調(diào)用時(shí)那么大,可見它是以目標(biāo)代碼的增加為代價(jià)來換取時(shí)間的節(jié)省窝爪。
1.內(nèi)聯(lián)函數(shù)可減少cpu的系統(tǒng)開銷弛车,并且程序的整體速度將加快,但當(dāng)內(nèi)聯(lián)函數(shù)很大時(shí)酸舍,會(huì)有相反的作用帅韧,因此一般比較小的函數(shù)才使用內(nèi)聯(lián)函數(shù).
2.有兩種內(nèi)聯(lián)函數(shù)的聲明方法,一種是在函數(shù)前使用inline關(guān)見字啃勉,另一種是在類的內(nèi)部定義函數(shù)的代碼忽舟,這樣的函數(shù)將自動(dòng)轉(zhuǎn)換為內(nèi)聯(lián)函數(shù),而且沒必要將inline放在函數(shù)前面.
3.內(nèi)聯(lián)是一種對(duì)編譯器的請(qǐng)求淮阐,下面這些情況會(huì)阻止編譯器服從這項(xiàng)請(qǐng)求.
如果函數(shù)中包含有循環(huán)叮阅,switch或goto語句,遞歸函數(shù)泣特,含有static的函數(shù).
由此可以看出浩姥,內(nèi)聯(lián)函數(shù)和成員函數(shù)沒什么區(qū)別,區(qū)別就在于怎樣加快函數(shù)的執(zhí)行速度而已状您。
內(nèi)聯(lián)函數(shù)是浪費(fèi)空間來節(jié)省時(shí)間的設(shè)置勒叠,因?yàn)楹瘮?shù)的調(diào)用是很浪費(fèi)時(shí)間的兜挨,寫成內(nèi)聯(lián)函數(shù)可以在每次調(diào)用時(shí)用函數(shù)體內(nèi)容代替函數(shù)調(diào)用,有點(diǎn)類似一個(gè)宏定義眯分。當(dāng)函數(shù)體語句較少拌汇,且沒有復(fù)雜的循環(huán)語句,且調(diào)用次數(shù)較多時(shí)弊决,就可以用內(nèi)聯(lián)函數(shù)噪舀。