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

內(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具有和宏同樣級別的開銷,而且還提供了類型安全,沒有長度和格式的具體限制。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容