您好,登錄后才能下訂單哦!
這篇文章主要介紹了編程語言中宏和內(nèi)聯(lián)函數(shù)的示例分析,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
第一部分:宏
為什么要使用宏呢?
因?yàn)楹瘮?shù)的調(diào)用必須要將程序執(zhí)行的順序轉(zhuǎn)移到函數(shù)所存放在內(nèi)存中的某個(gè)地址,將函數(shù)的程序內(nèi)容執(zhí)行完后,再返回到轉(zhuǎn)去執(zhí)行該函數(shù)前的地方。這種轉(zhuǎn)移操作要求在轉(zhuǎn)去執(zhí)行前要保存現(xiàn)場(chǎng)并記憶執(zhí)行的地址,轉(zhuǎn)回后要恢復(fù)現(xiàn)場(chǎng),并按原來保存地址繼續(xù)執(zhí)行。因此,函數(shù)調(diào)用要有一定的時(shí)間和空間方面的開銷,于是將影響其效率。
而宏只是在預(yù)處理的地方把代碼展開,不需要額外的空間和時(shí)間方面的開銷,所以調(diào)用一個(gè)宏比調(diào)用一個(gè)函數(shù)更有效率。
但是宏也有很多的不盡人意的地方。
1、宏不能訪問對(duì)象的私有成員。
2、宏的定義很容易產(chǎn)生二意性。
我們舉個(gè)例子:
#define square(x) (x*x)
我們用一個(gè)數(shù)字去調(diào)用它,square(5),這樣看上去沒有什么錯(cuò)誤,結(jié)果返回25,是正確的,但是如果我們用squre (5+5)去調(diào)用的話,我們期望的結(jié)果是100,而宏的調(diào)用結(jié)果是(5+5*5+5),結(jié)果是35,這顯然不是我們要得到的結(jié)果。避免這些錯(cuò)誤的方法,一是給宏的參數(shù)都加上括號(hào)。
#define square(x) ((x)*(x))
第二部分:內(nèi)聯(lián)函數(shù)
從上面的闡述,可以看到宏有一些難以避免的問題,怎么解決呢?
內(nèi)聯(lián)函數(shù)是代碼被插入到調(diào)用者代碼處的函數(shù)。如同 #define 宏,內(nèi)聯(lián)函數(shù)通過避免被調(diào)用的開銷來提高執(zhí)行效率,尤其是它能夠通過調(diào)用(“過程化集成”)被編譯器優(yōu)化。
內(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)生于處理宏的一些問題。
聲明內(nèi)聯(lián)函數(shù)看上去和普通函數(shù)非常相似:
void f(int i, char c);
當(dāng)你定義一個(gè)內(nèi)聯(lián)函數(shù)時(shí),在函數(shù)定義前加上 inline 關(guān)鍵字,并且將定義放入頭文件:
inline void f(int i, char c)
{
// ...
}
內(nèi)聯(lián)函數(shù)必須是和函數(shù)體申明在一起,才有效。
像這樣的申明inline function(int i)是沒有效果的,編譯器只是把函數(shù)作為普通的函數(shù)申明,我們必須定義函數(shù)體。
inline int function(int i) {return i*i;}
這樣我們才算定義了一個(gè)內(nèi)聯(lián)函數(shù)。我們可以把它作為一般的函數(shù)一樣調(diào)用。但是執(zhí)行速度確比一般函數(shù)的執(zhí)行速度要快。
當(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í)行效率一樣了。
有上面的兩者的特性,我們可以用內(nèi)聯(lián)函數(shù)完全取代預(yù)處理宏。
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“編程語言中宏和內(nèi)聯(lián)函數(shù)的示例分析”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。