(inline)內嵌函式在IOS開發中的使用,inlineios

來源:互聯網
上載者:User

(inline)內嵌函式在IOS開發中的使用,inlineios

今天在閱讀YYKit源碼(https://github.com/ibireme/YYKit.git)時發現在YYKitMacro.h組件中大量使用的內嵌函式,例如此檔案中的一個函數

static inline void dispatch_async_on_main_queue(void (^block)()) {    if (pthread_main_np()) {        block();    } else {        dispatch_async(dispatch_get_main_queue(), block);    }}

使用這個函數

dispatch_async_on_main_queue(^{            });

比如下我們經常使用起來更加簡潔:

dispatch_async(dispatch_get_main_queue(), ^{            });

那麼再次使用內嵌函式有什麼好處呢?先說什麼是內嵌函式,課本上的定義:內嵌函式是指用inline關鍵字修飾的函數。內嵌函式不是在調用時發生控制轉移,而是在編譯時間將函數體嵌入在每一個調用處。編譯時間,類似宏替換,使用函數體替換調用處的函數名。C語言原本是不支援inline的,但C++中原生對inline的支援讓很多C編譯器也為C語言實現了一些支援inline語義的擴充。C99將inline正式放入到標準C語言中,並提供了inline關鍵字。和C++中的inline一樣,C99的inline也是對編譯器的一個提示,提示編譯器盡量按照內嵌函式的定義去編譯,去除函數調用帶來的開銷。

C中引入inline關鍵字的原因:
inline 關鍵字用來定義一個類的內嵌函式,引入它的主要原因是用它替代C中運算式形式的宏定義。


運算式形式的宏定義一例:
#define ExpressionName(Var1,Var2) (Var1+Var2)*(Var1-Var2)

為什麼要取代這種形式呢,且聽我道來:

1.首先談一下在C中使用這種形式宏定義的原因,C語言是一個效率很高的語言,這種宏定義在形式及使用上像一個函數,但它使用前置處理器實現,沒有了參數壓棧,代碼產生等一系列的操作,因此,效率很高,這是它在C中被使用的一個主要原因。

2.這種宏定義在形式上類似於一個函數,但在使用它時,僅僅只是做前置處理器符號表中的簡單替換,因此它不能進行參數有效性的檢測,也就不能享受C編譯器嚴格類型檢查的好處,另外它的傳回值也不能被強制轉換為可轉換的合適的類型,這樣,它的使用就存在著一系列的隱患和局限性。

3.在C中引入了類及類的存取控制,這樣,如果一個操作或者說一個運算式涉及到類的保護成員或私人成員,你就不可能使用這種宏定義來實現。

4. inline 推出的目的,也正是為了取代這種運算式形式的宏定義,它消除了它的缺點,同時又很好地繼承了它的優點。

在使用inline函數要注意
1、你可以使用inline函數完全取代運算式形式的宏定義。

2、內嵌函式一般只會用在函數內容非常簡單的時候,這是因為,內嵌函式的代碼會在任何調用它的地方展開,如果函數太複雜,代碼膨脹帶來的惡果很可能會大於效率的提高帶來的益處。

3、在內嵌函式內不允許用迴圈語句和 開關語句。 如果內嵌函式有這些語句,則編譯將該函數視同普通函數那樣產生函數調用代碼,遞迴函式(自己調用自己的函數)是不能被用來做內嵌函式的。內聯 函數只適合於只有1~5行的小函數。對一個含有許多語句的大函數,函數調用和返回的開銷相對來說微不足道,所以也沒有必要用內嵌函式實現。

既然上面說使用內嵌函式效率會提高,所以我簡單的謝了代碼驗證下

測試代碼如下:

static inline void add(int x, int y);int main(int argc, const char * argv[]) {    clock_t start, finish;    double  duration;    start = clock();    for (int i =0,j =0; i<100000; i++,j++) {        add(i,j);    }    finish = clock();    duration = (double)(finish - start) / CLOCKS_PER_SEC;    printf( "%f seconds\n", duration );    return 0;}void add(int x, int y){    int k = x+y;    printf("%d\n",k);    }

連續運行三次列印的結果是:

0.086523 seconds
0.086504 seconds
0.085425 seconds

然後把內嵌函式改為普通函數再運行三次

void add(int x, int y);int main(int argc, const char * argv[]) {    clock_t start, finish;    double  duration;    start = clock();    for (int i =0,j =0; i<100000; i++,j++) {        add(i,j);    }    finish = clock();    duration = (double)(finish - start) / CLOCKS_PER_SEC;    printf( "%f seconds\n", duration );    return 0;}void add(int x, int y){    int k = x+y;    printf("%d\n",k);    }

列印結果:

0.085639 seconds
0.086934 seconds
0.085713 seconds

從結果可以看出,在本測試代碼中使用內嵌函式確實能提高運行速度。所以我們以後可以在項目中適度使用內嵌函式來提高APP效能。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.