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

宏的缺陷與內(nèi)聯(lián)函數(shù)的引入
評論