標籤:
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
文/凡路(簡書作者)
原文連結:http://www.jianshu.com/p/d557b0831c6a
著作權歸作者所有,轉載請聯絡作者獲得授權,並標註“簡書作者”。
iOS OC內嵌函式 inline的詳解