今天沒事又重新看了一遍SDWEbImage看到了inline內(nèi)聯(lián)函數(shù)的使用,
所以在此整理一下,根據(jù) 1>什么是內(nèi)聯(lián)函數(shù), 2>及他的用法, 3> 它與宏定義和函數(shù)的區(qū)別 4> 使用時的注意點等方面來介紹一下.
一,什么是內(nèi)聯(lián)函數(shù):
內(nèi)聯(lián)函數(shù)是指用inline關鍵字修飾的函數(shù).內(nèi)聯(lián)函數(shù)不是在調(diào)用時發(fā)生控制轉(zhuǎn)移,而是在編譯時將函數(shù)體嵌入在每一個調(diào)用處.編譯時,類似于宏替換,使用函數(shù)體替換調(diào)用處的函數(shù)名,C語言原本是不支持inline的,但C++中原生對inline的支持讓很多C編譯器也為C語言實現(xiàn)了一些支持inline語義的擴展.C99將inline正式放入標準C語言中并提供了inline關鍵字.和C++中的inline一樣,C99的inline也是對編譯器的一個提示,提示編譯器盡量按照內(nèi)聯(lián)函數(shù)的定義去編譯,去除函數(shù)調(diào)用帶來的開銷.
二,內(nèi)聯(lián)函數(shù)的用法
inline 關鍵字用來定義一個類的內(nèi)聯(lián)函數(shù),引入他的主要目的是用它來替代C中表達式形式的宏定義(其實它的用法跟宏一樣,只不過比宏的安全性,效率更好).
三,inline與宏和函數(shù)的比較
和宏相比較的優(yōu)點:
1)宏在使用時,僅僅只做預處理器符號表中的簡單替換,因此它不能進行參數(shù)有效性的檢測,也不能享受C編譯器嚴格類型檢查的好處,另外它的返回值也不能被強制轉(zhuǎn)換為可轉(zhuǎn)換的合適類型,這樣,它的使用就存在著一系列隱患和局限.而使用內(nèi)聯(lián)函數(shù)時,會首先檢查它的參數(shù)的類型,保證調(diào)用正確,然后進行一系列的相關檢查,就像對待任何一個真正的函數(shù)一樣,這樣就消除了它的隱患和局限性.
2)內(nèi)聯(lián)函數(shù)也是函數(shù),不需要預編譯,而宏需要預編譯.
和直接使用函數(shù)的比較:
1)集成了宏的優(yōu)點,使用時直接用代碼替換;
2)inline函數(shù)避免了普通函數(shù)的在匯編時必須調(diào)用call的缺點,取消了函數(shù)的參數(shù)壓棧,減少了調(diào)用的開銷,提高效率,所以執(zhí)行速度比一般函數(shù)的執(zhí)行速度快.
四,相比之下inline內(nèi)聯(lián)函數(shù)確實有很多優(yōu)點,那么使用時我們需要注意些什么呢??
1)你可以使用inline函數(shù)完全替代表達式的宏定義;
2)內(nèi)聯(lián)函數(shù)一般只會用在函數(shù)內(nèi)容非常簡單的時候,這是因為內(nèi)聯(lián)函數(shù)的代碼會在任何調(diào)用它的地方展開,如果函數(shù)太復雜,代碼膨脹帶來的惡果很可能會大于效率提高帶來的好處.
3)在內(nèi)聯(lián)函數(shù)內(nèi)不允許使用循環(huán)語句和開關語句.如果內(nèi)聯(lián)函數(shù)有這些語句,則編譯將該函數(shù)視同普通的函數(shù)那樣產(chǎn)生函數(shù)調(diào)用代碼,遞歸函數(shù)是不能用來做內(nèi)聯(lián)函數(shù)的
4)內(nèi)聯(lián)函數(shù)需定義在調(diào)用之前.
最后希望大家能夠更好地掌握inline的用法,達到高效開發(fā)的目的.