內(nèi)聯(lián)函數(shù)的預(yù)編譯指令
-
#define CG_INLINE static inline
-
inline
- 在inline加上static修飾符,只是為了表明該函數(shù)只在該文件中可見!也就是說,在同一個工程中,就算在其他文件中也出現(xiàn)同名、同參數(shù)的函數(shù)也不會引起函數(shù)重復(fù)定義的錯誤!
- CoreGraphics里的內(nèi)聯(lián)函數(shù),在函數(shù)前聲明后編譯器執(zhí)行起來更具效率,使宏的定義更節(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)用效率的問題
- 由于函數(shù)之間的調(diào)用,會從一個內(nèi)存地址調(diào)到另外一個內(nèi)存地址,當(dāng)函數(shù)調(diào)用完畢之后還會返回原來函數(shù)執(zhí)行的地址。函數(shù)調(diào)用會有一定的時間開銷,引入內(nèi)聯(lián)函數(shù)就是為了解決這一問題
<br />
如何提升函數(shù)調(diào)用效率
匯編中可以發(fā)現(xiàn):使用內(nèi)聯(lián)與否,直接影響匯編代碼中是否出現(xiàn) call 指令:
call指令就是就需要:
(1)將下一條指令的所在地址(即當(dāng)時程序計數(shù)器PC的內(nèi)容)入棧
(2)并將子程序的起始地址送入PC(于是CPU的下一條指令就會轉(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ù),還要看編譯器對內(nèi)聯(lián)函數(shù)體內(nèi)部的定義的具體處理。產(chǎn)生的動機:
消除函數(shù)調(diào)用產(chǎn)生的開銷,適合與小內(nèi)存函數(shù),頻繁執(zhí)行的函數(shù)。注意事項:
不能使用循環(huán)語句;不能使用開關(guān)語句;不能使用遞歸調(diào)用;定義在第一次調(diào)用之前;結(jié)合使用的問題:
static inline fun_returnType Fun_name(param...){}
static 標(biāo)識此內(nèi)聯(lián)聯(lián)函數(shù)只能在本文件中使用,限制了內(nèi)聯(lián)函數(shù)的作用域。相對于宏來說,static inline具有和宏同樣級別的開銷,而且還提供了類型安全,沒有長度和格式的具體限制。