內(nèi)聯(lián)函數(shù)的預(yù)編譯指令
-
#define CG_INLINE static inline
-
inline
- 在inline加上static修飾符者娱,只是為了表明該函數(shù)只在該文件中可見阁簸!也就是說(shuō),在同一個(gè)工程中氯夷,就算在其他文件中也出現(xiàn)同名、同參數(shù)的函數(shù)也不會(huì)引起函數(shù)重復(fù)定義的錯(cuò)誤靶擦!
- CoreGraphics里的內(nèi)聯(lián)函數(shù)腮考,在函數(shù)前聲明后編譯器執(zhí)行起來(lái)更具效率,使宏的定義更節(jié)省玄捕,不涉及棧的操作踩蔚。(這句話出自這里CG_INLINE note)
- CG_INLINE:
It is a #define for static inline. This causes the compiler to create the code for the function inline, rather that creating a function call on the stack. See here and here for more information.
<br />
為什么引入內(nèi)聯(lián)函數(shù)
- 引入內(nèi)聯(lián)函數(shù)是為了解決函數(shù)調(diào)用效率的問(wèn)題
- 由于函數(shù)之間的調(diào)用,會(huì)從一個(gè)內(nèi)存地址調(diào)到另外一個(gè)內(nèi)存地址枚粘,當(dāng)函數(shù)調(diào)用完畢之后還會(huì)返回原來(lái)函數(shù)執(zhí)行的地址馅闽。函數(shù)調(diào)用會(huì)有一定的時(shí)間開銷,引入內(nèi)聯(lián)函數(shù)就是為了解決這一問(wèn)題
<br />
如何提升函數(shù)調(diào)用效率
匯編中可以發(fā)現(xiàn):使用內(nèi)聯(lián)與否赌结,直接影響匯編代碼中是否出現(xiàn) call 指令:
call指令就是就需要:
(1)將下一條指令的所在地址(即當(dāng)時(shí)程序計(jì)數(shù)器PC的內(nèi)容)入棧
(2)并將子程序的起始地址送入PC(于是CPU的下一條指令就會(huì)轉(zhuǎn)去執(zhí)行子程序)
參看ios內(nèi)聯(lián)函數(shù) inline
ios 開發(fā)中使用內(nèi)聯(lián)函數(shù)
定義:
有函數(shù)的結(jié)構(gòu)捞蛋,但不具備函數(shù)的性質(zhì),類似于宏替換柬姚。代碼中使用inline定義拟杉,能否形成內(nèi)聯(lián)函數(shù),還要看編譯器對(duì)內(nèi)聯(lián)函數(shù)體內(nèi)部的定義的具體處理量承。產(chǎn)生的動(dòng)機(jī):
消除函數(shù)調(diào)用產(chǎn)生的開銷搬设,適合與小內(nèi)存函數(shù),頻繁執(zhí)行的函數(shù)撕捍。注意事項(xiàng):
不能使用循環(huán)語(yǔ)句拿穴;不能使用開關(guān)語(yǔ)句;不能使用遞歸調(diào)用忧风;定義在第一次調(diào)用之前默色;結(jié)合使用的問(wèn)題:
static inline fun_returnType Fun_name(param...){}
static 標(biāo)識(shí)此內(nèi)聯(lián)聯(lián)函數(shù)只能在本文件中使用,限制了內(nèi)聯(lián)函數(shù)的作用域狮腿。相對(duì)于宏來(lái)說(shuō)腿宰,static inline具有和宏同樣級(jí)別的開銷呕诉,而且還提供了類型安全,沒有長(zhǎng)度和格式的具體限制吃度。