OC 內聯(lián)函數 inline

在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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容