內(nèi)聯(lián)函數(shù)是代碼被插入到調(diào)用者代碼處的函數(shù)票罐。如同?#define?宏盏浙,內(nèi)聯(lián)函數(shù)通過避免被調(diào)用的開銷來提高執(zhí)行效率系羞,尤其是它能夠通過調(diào)用(“過程化集成”)被編譯器優(yōu)化复罐。?宏定義不檢查函數(shù)參數(shù)匣掸,返回值什么的趟紊,只是展開,相對(duì)來說碰酝,內(nèi)聯(lián)函數(shù)會(huì)檢查參數(shù)類型霎匈,所以更安全。
內(nèi)聯(lián)函數(shù)和宏很類似送爸,而區(qū)別在于铛嘱,宏是由預(yù)處理器對(duì)宏進(jìn)行替代,而內(nèi)聯(lián)函數(shù)是通過編譯器控制來實(shí)現(xiàn)的袭厂。而且內(nèi)聯(lián)函數(shù)是真正的函數(shù)墨吓,只是在需要用到的時(shí)候,內(nèi)聯(lián)函數(shù)像宏一樣的展開纹磺,所以取消了函數(shù)的參數(shù)壓棧帖烘,減少了調(diào)用的開銷。你可以象調(diào)用函數(shù)一樣來調(diào)用內(nèi)聯(lián)函數(shù)橄杨,而不必?fù)?dān)心會(huì)產(chǎn)生于處理宏的一些問題秘症。?
我們知道一般的函數(shù)調(diào)用都會(huì)通過call的方式來調(diào)用,hacker很容易對(duì)一個(gè)函數(shù)做手腳讥珍,如果是以inline的方式編譯的历极,會(huì)把該函數(shù)的code拷貝到每次調(diào)用該函數(shù)的地方;而static會(huì)讓生成的二進(jìn)制文件中沒有清晰的符號(hào)表,讓逆向的人很難弄清楚邏輯
staticintisValidate(intid) __attribute__ ((always_inline));staticinlineintisValidate(intid);
定義:有函數(shù)的結(jié)構(gòu)衷佃,但不具備函數(shù)的性質(zhì)趟卸,類似于宏替換。代碼中使用inline定義,能否形成內(nèi)聯(lián)函數(shù)锄列,還要看編譯器對(duì)內(nèi)聯(lián)函數(shù)體內(nèi)部的定義的具體處理
1.使用inline
修飾的函數(shù)图云,在編譯的時(shí)候,會(huì)把代碼直接嵌入調(diào)用代碼中邻邮。就相當(dāng)于用#define 宏定義來定義一個(gè)add 函數(shù)那樣竣况!與#define的區(qū)別是:
1)#define定義的格式要有要求,而使用inline則就行平常寫函數(shù)那樣筒严,只要加上inline即可丹泉!
2)使用#define宏定義的代碼,編譯器不會(huì)對(duì)其進(jìn)行參數(shù)有效性檢查鸭蛙,僅僅只是對(duì)符號(hào)表進(jìn)行替換摹恨。
3#define宏定義的代碼,其返回值不能被強(qiáng)制轉(zhuǎn)換成可轉(zhuǎn)換的適合的轉(zhuǎn)換類型娶视。
2.在inline加上static修飾符
只是為了表明該函數(shù)只在該文件中可見晒哄!也就是說,在同一個(gè)工程中肪获,就算在其他文件中也出現(xiàn)同名寝凌、同參數(shù)的函數(shù)也不會(huì)引起函數(shù)重復(fù)定義的錯(cuò)誤
?當(dāng)然,內(nèi)聯(lián)函數(shù)也有一定的局限性孝赫。就是函數(shù)中的執(zhí)行代碼不能太多了较木,如果,內(nèi)聯(lián)函數(shù)的函數(shù)體過大寒锚,一般的編譯器會(huì)放棄內(nèi)聯(lián)方式劫映,而采用普通的方式調(diào)用函數(shù)。這樣刹前,內(nèi)聯(lián)函數(shù)就和普通函數(shù)執(zhí)行效率一樣了。