宏雖然有著一定的優(yōu)勢(shì),但是它的缺點(diǎn)也不可忽視。
在編譯階段,我們很難發(fā)現(xiàn)代碼哪里出問(wèn)題了,因?yàn)楹晏鎿Q是發(fā)生在預(yù)處理階段,所以有時(shí)候在宏函數(shù)傳參的時(shí)候發(fā)生一些錯(cuò)誤,編譯器不會(huì)發(fā)現(xiàn),那它調(diào)試起來(lái)就很麻煩。
所以為了解決這種不利于調(diào)試的問(wèn)題,就有了內(nèi)聯(lián)函數(shù)。
那么什么是內(nèi)聯(lián)函數(shù)呢?
我們以inline修飾的函數(shù)叫做內(nèi)聯(lián)函數(shù),編譯階段,C編譯器會(huì)在調(diào)用函數(shù)的地方直接把函數(shù)展開,沒(méi)有壓棧開銷,內(nèi)聯(lián)函數(shù)提升程序運(yùn)行效率,但是會(huì)相應(yīng)的增加代碼的長(zhǎng)度。所以這里叫做空間換時(shí)間。
道之初,帶來(lái)了空間和時(shí)間,所以,空間和時(shí)間就是編程的陰陽(yáng)兩級(jí)。
不懂編程之道的程序員常常把空間和時(shí)間消耗殆盡,得道的程序員則總是有足夠的空間和時(shí)間完成編程任務(wù)。
舉個(gè)例子
inline int Add(int a,int b){ return a+b;}
編譯期間,編譯器會(huì)將內(nèi)聯(lián)函數(shù)替換相應(yīng)的函數(shù)體;
這里要注意一點(diǎn),在函數(shù)前加 inline 只是建議編譯器當(dāng)作內(nèi)容函數(shù)處理 ,但編譯器有自己的主張(遞歸 ,復(fù)雜函數(shù)等)
內(nèi)聯(lián)函數(shù)的特性:
inline是一種以空間換時(shí)間的做法,省去調(diào)用函數(shù)中參數(shù)壓棧,減少了調(diào)用的開銷。同時(shí),使用內(nèi)聯(lián)函數(shù)也比宏函數(shù)更省心,不必?fù)?dān)心宏參數(shù)傳遞過(guò)程中出現(xiàn)的意外情況。
inline對(duì)于編譯器而言只是一個(gè)建議,編譯器會(huì)自動(dòng)優(yōu)化,如果定義為inline的函數(shù)體內(nèi)有循環(huán)/遞歸等等,編譯器優(yōu)化時(shí)會(huì)忽略掉內(nèi)聯(lián),另外,如果內(nèi)聯(lián)函數(shù)的函數(shù)體過(guò)大,一般的編譯器也會(huì)放棄內(nèi)聯(lián)方式,采用普通調(diào)用的方式進(jìn)行函數(shù)調(diào)用。
inline不建議聲明和定義分離,分離會(huì)導(dǎo)致鏈接錯(cuò)誤。因?yàn)閕nline被展開,就沒(méi)有函數(shù)地址了,鏈接就會(huì)找不到。
-
函數(shù)
+關(guān)注
關(guān)注
3文章
4417瀏覽量
67534 -
代碼
+關(guān)注
關(guān)注
30文章
4968瀏覽量
73999 -
編譯器
+關(guān)注
關(guān)注
1文章
1672瀏覽量
51645
發(fā)布評(píng)論請(qǐng)先 登錄
C語(yǔ)言中實(shí)現(xiàn)函數(shù)宏的三種方式
內(nèi)聯(lián)函數(shù)介紹
C語(yǔ)言的編程技巧
控制流和函數(shù)調(diào)用的精細(xì)調(diào)整
inline ASM(內(nèi)聯(lián)匯編)的細(xì)節(jié)分享
簡(jiǎn)單的內(nèi)聯(lián)匯編介紹
RISC-V的工具鏈GCC內(nèi)聯(lián)匯編
計(jì)算程序執(zhí)行指令數(shù)的函數(shù)實(shí)現(xiàn)
GCC內(nèi)聯(lián)匯編
通過(guò)內(nèi)聯(lián)匯編調(diào)用乘法指令mulh\\mulhsu\\mulhu
C語(yǔ)言中的內(nèi)聯(lián)函數(shù)與宏
MSP430常用內(nèi)聯(lián)函數(shù)說(shuō)明
Vicor助力宏發(fā)打造主動(dòng)懸架電源系統(tǒng)
迅為RK3568開發(fā)板驅(qū)動(dòng)指南GPIO子系統(tǒng)GPIO子系統(tǒng)API函數(shù)的引入
芯片離子注入后退火會(huì)引入的工藝問(wèn)題
宏的缺陷與內(nèi)聯(lián)函數(shù)的引入
評(píng)論