宏雖然有著一定的優(yōu)勢,但是它的缺點也不可忽視。
在編譯階段,我們很難發(fā)現(xiàn)代碼哪里出問題了,因為宏替換是發(fā)生在預處理階段,所以有時候在宏函數(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ù)提升程序運行效率,但是會相應的增加代碼的長度。所以這里叫做空間換時間。
道之初,帶來了空間和時間,所以,空間和時間就是編程的陰陽兩級。
不懂編程之道的程序員常常把空間和時間消耗殆盡,得道的程序員則總是有足夠的空間和時間完成編程任務。
舉個例子
inline int Add(int a,int b){ return a+b;}
編譯期間,編譯器會將內(nèi)聯(lián)函數(shù)替換相應的函數(shù)體;
這里要注意一點,在函數(shù)前加 inline 只是建議編譯器當作內(nèi)容函數(shù)處理 ,但編譯器有自己的主張(遞歸 ,復雜函數(shù)等)
內(nèi)聯(lián)函數(shù)的特性:
inline是一種以空間換時間的做法,省去調(diào)用函數(shù)中參數(shù)壓棧,減少了調(diào)用的開銷。同時,使用內(nèi)聯(lián)函數(shù)也比宏函數(shù)更省心,不必擔心宏參數(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)用的方式進行函數(shù)調(diào)用。
inline不建議聲明和定義分離,分離會導致鏈接錯誤。因為inline被展開,就沒有函數(shù)地址了,鏈接就會找不到。
-
函數(shù)
+關(guān)注
關(guān)注
3文章
4327瀏覽量
62573 -
代碼
+關(guān)注
關(guān)注
30文章
4779瀏覽量
68527 -
編譯器
+關(guān)注
關(guān)注
1文章
1624瀏覽量
49108
發(fā)布評論請先 登錄
相關(guān)推薦
評論