iOS OC內聯函數 inline

inline

在iOS中的一些框架中,static inline是經常出現的關鍵字組合.

  • static自不用多說,表示在當前文件中應用,如 static A, 在其它文件中也可以出現static A.不會導致重名的錯誤.
  • inline.內聯函數.
  • 作用:替代宏.

(如果你在看框架時,看到inline不解,搜索到這篇文章,看到這里可以不用看下面的詳述了)

  • 在框架中出現inline時,如YYKit框架.我們稍加觀察就會發現它出現在.h文件中. such as:
static inline CGFloat CGFloatFromPixel(CGFloat value) {
    return value / YYScreenScale();
}

//YYScreenScale()方法說明:
CGFloat YYScreenScale() {
    static CGFloat scale;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        scale = [UIScreen mainScreen].scale;
    });
    return scale;
}

雖然static inline修飾的是函數(或者方法,swift出來后,我覺著方法==函數,朋友們不用咬文嚼字,鄙視我輩了).但它在這里就是宏的作用,即你可以將CGFloatFromPixel當作一個宏.
當然inline函數與宏有區別,inline可以:

  • 解決函數調用效率的問題:
  • 函數之間調用,是內存地址之間的調用,當函數調用完畢之后還會返回原來函數執行的地址。函數調用有時間開銷,內聯函數就是為了解決這一問題。
  • 不用inline修飾的函數, 匯編時會出現 call 指令.調用call指令就是就需要:
    • (1)將下一條指令的所在地址入棧
    • (2)并將子程序的起始地址送入PC(于是CPU的下一條指令就會轉去執行子程序).

結論

為什么inline能取代宏?
  • 優點相比于函數:

    1. inline函數避免了普通函數的,在匯編時必須調用call的缺點:取消了函數的參數壓棧,減少了調用的開銷,提高效率.所以執行速度確比一般函數的執行速度要快.
  • 2)集成了宏的優點,使用時直接用代碼替換(像宏一樣);

  • 優點相比于宏:

  • 1)避免了宏的缺點:需要預編譯.因為inline內聯函數也是函數,不需要預編譯.

  • 2)編譯器在調用一個內聯函數時,會首先檢查它的參數的類型,保證調用正確。然后進行一系列的相關檢查,就像對待任何一個真正的函數一樣。這樣就消除了它的隱患和局限性。

  • 3)可以使用所在類的保護成員及私有成員。

inline內聯函數的說明
  • 1.內聯函數只是我們向編譯器提供的申請,編譯器不一定采取inline形式調用函數.
  • 2.內聯函數不能承載大量的代碼.如果內聯函數的函數體過大,編譯器會自動放棄內聯.
  • 3.內聯函數內不允許使用循環語句或開關語句.
  • 4.內聯函數的定義須在調用之前.

參考資料:

http://stackoverflow.com/questions/11985307/static-extern-and-inline-in-objective-c

http://tigcc.ticalc.org/doc/gnuexts.html#SEC93

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

推薦閱讀更多精彩內容