在iOS的一些框架中, static inline 是經常出現的關鍵字組合,主要是為了提高函數調用的效率。

內聯(lián)函數:
內聯(lián)函數是指用 inline 關鍵字修飾的函數。在類內定義的函數被默認成內聯(lián)函數。內聯(lián)函數從源代碼層看,有函數的結構,而在編譯后,卻不具備函數的性質。內聯(lián)函數不是在調用時發(fā)生控制轉移,而是在編譯時將函數體嵌入在每一個調用處。編譯時類似于宏替換,使用函數體替換調用處的函數名。一般在代碼中用 inline 修飾,但是能否形成內聯(lián)函數,需要看編譯器對該函數定義的具體處理。
inline 內聯(lián)函數,作用是代替宏。
inline 和宏的區(qū)別:
inline 可以:
1、解決函數調用效率問題
2、函數之間調用,是內存地址之間的調用,當函數調用完畢之后還會返回原來函數執(zhí)行的地址。函數調用有時間開銷,內聯(lián)函數就是為了解決這一問題。
3、不用 inline 修飾的函數,匯編時會出現 call 指令,調用 call 指令就是需要:
(1)將下一條指令的所在地址入棧
(2)并將子程序的起始地址送入 PC (于是 CPU 的下一條指令就會轉去執(zhí)行子程序)
結論:為什么 inline 能替代宏?
優(yōu)點相比于函數:
1、inline 函數避免了普通函數的在匯編時必須調用 call 的缺點:取消了函數的參數壓棧,減少了調用的開銷,提高效率,所以執(zhí)行速度比一般函數要執(zhí)行的快。
2、集成了宏的優(yōu)點,使用時直接用代碼替換
優(yōu)點相比于宏:
1、避免了宏的缺點:需要預編譯。因為內聯(lián)函數 inline 也是函數,不需要預編譯。
2、編譯器在調用一個內聯(lián)函數時,會首先檢查它的參數的類型,保證調用正確。然后進行一系列的相關檢查,就像對待任何一個真正的函數一樣。這樣就消除了它的隱患和局限性。
3、可以使用所在類的保護成員及私有成員。
inline 內聯(lián)函數的說明
1、內聯(lián)函數只是我們像編譯器提供的申請,編譯器不一定采取 inline 形式調用函數。
2、內聯(lián)函數不宜承載大量的代碼,如果內聯(lián)函數的函數體過大,編譯器就會自動放棄內聯(lián)。
3、如果函數體出現循環(huán),那么執(zhí)行函數體內的代碼的時間要比函數調用的開銷大。
3、內聯(lián)函數的定義需在調用之前。
參考文章:
http://www.itdecent.cn/p/d557b0831c6a
http://www.itdecent.cn/p/dd47d8ec8d07