這篇文章主要介紹了編程語言中宏和內聯(lián)函數(shù)的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
創(chuàng)新互聯(lián)主營尚義網(wǎng)站建設的網(wǎng)絡公司,主營網(wǎng)站建設方案,成都App制作,尚義h5微信小程序定制開發(fā)搭建,尚義網(wǎng)站營銷推廣歡迎尚義等地區(qū)企業(yè)咨詢
第一部分:宏
為什么要使用宏呢?
因為函數(shù)的調用必須要將程序執(zhí)行的順序轉移到函數(shù)所存放在內存中的某個地址,將函數(shù)的程序內容執(zhí)行完后,再返回到轉去執(zhí)行該函數(shù)前的地方。這種轉移操作要求在轉去執(zhí)行前要保存現(xiàn)場并記憶執(zhí)行的地址,轉回后要恢復現(xiàn)場,并按原來保存地址繼續(xù)執(zhí)行。因此,函數(shù)調用要有一定的時間和空間方面的開銷,于是將影響其效率。
而宏只是在預處理的地方把代碼展開,不需要額外的空間和時間方面的開銷,所以調用一個宏比調用一個函數(shù)更有效率。
但是宏也有很多的不盡人意的地方。
1、宏不能訪問對象的私有成員。
2、宏的定義很容易產(chǎn)生二意性。
我們舉個例子:
#define square(x) (x*x)
我們用一個數(shù)字去調用它,square(5),這樣看上去沒有什么錯誤,結果返回25,是正確的,但是如果我們用squre (5+5)去調用的話,我們期望的結果是100,而宏的調用結果是(5+5*5+5),結果是35,這顯然不是我們要得到的結果。避免這些錯誤的方法,一是給宏的參數(shù)都加上括號。
#define square(x) ((x)*(x))
第二部分:內聯(lián)函數(shù)
從上面的闡述,可以看到宏有一些難以避免的問題,怎么解決呢?
內聯(lián)函數(shù)是代碼被插入到調用者代碼處的函數(shù)。如同 #define 宏,內聯(lián)函數(shù)通過避免被調用的開銷來提高執(zhí)行效率,尤其是它能夠通過調用(“過程化集成”)被編譯器優(yōu)化。
內聯(lián)函數(shù)和宏很類似,而區(qū)別在于,宏是由預處理器對宏進行替代,而內聯(lián)函數(shù)是通過編譯器控制來實現(xiàn)的。而且內聯(lián)函數(shù)是真正的函數(shù),只是在需要用到的時候,內聯(lián)函數(shù)像宏一樣的展開,所以取消了函數(shù)的參數(shù)壓棧,減少了調用的開銷。你可以象調用函數(shù)一樣來調用內聯(lián)函數(shù),而不必擔心會產(chǎn)生于處理宏的一些問題。
聲明內聯(lián)函數(shù)看上去和普通函數(shù)非常相似:
void f(int i, char c);
當你定義一個內聯(lián)函數(shù)時,在函數(shù)定義前加上 inline 關鍵字,并且將定義放入頭文件:
inline void f(int i, char c)
{
// ...
}
內聯(lián)函數(shù)必須是和函數(shù)體申明在一起,才有效。
像這樣的申明inline function(int i)是沒有效果的,編譯器只是把函數(shù)作為普通的函數(shù)申明,我們必須定義函數(shù)體。
inline int function(int i) {return i*i;}
這樣我們才算定義了一個內聯(lián)函數(shù)。我們可以把它作為一般的函數(shù)一樣調用。但是執(zhí)行速度確比一般函數(shù)的執(zhí)行速度要快。
當然,內聯(lián)函數(shù)也有一定的局限性。就是函數(shù)中的執(zhí)行代碼不能太多了,如果,內聯(lián)函數(shù)的函數(shù)體過大,一般的編譯器會放棄內聯(lián)方式,而采用普通的方式調用函數(shù)。這樣,內聯(lián)函數(shù)就和普通函數(shù)執(zhí)行效率一樣了。
有上面的兩者的特性,我們可以用內聯(lián)函數(shù)完全取代預處理宏。
感謝你能夠認真閱讀完這篇文章,希望小編分享的“編程語言中宏和內聯(lián)函數(shù)的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián),關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關知識等著你來學習!