91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

編程語言中宏和內聯函數的示例分析

發布時間:2022-01-14 17:19:57 來源:億速云 閱讀:101 作者:小新 欄目:編程語言

這篇文章主要介紹了編程語言中宏和內聯函數的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

第一部分:宏

為什么要使用宏呢?
因為函數的調用必須要將程序執行的順序轉移到函數所存放在內存中的某個地址,將函數的程序內容執行完后,再返回到轉去執行該函數前的地方。這種轉移操作要求在轉去執行前要保存現場并記憶執行的地址,轉回后要恢復現場,并按原來保存地址繼續執行。因此,函數調用要有一定的時間和空間方面的開銷,于是將影響其效率。
而宏只是在預處理的地方把代碼展開,不需要額外的空間和時間方面的開銷,所以調用一個宏比調用一個函數更有效率。
但是宏也有很多的不盡人意的地方。
1、宏不能訪問對象的私有成員。
2、宏的定義很容易產生二意性。
我們舉個例子:
#define square(x) (x*x)
我們用一個數字去調用它,square(5),這樣看上去沒有什么錯誤,結果返回25,是正確的,但是如果我們用squre (5+5)去調用的話,我們期望的結果是100,而宏的調用結果是(5+5*5+5),結果是35,這顯然不是我們要得到的結果。避免這些錯誤的方法,一是給宏的參數都加上括號。
#define square(x) ((x)*(x))

第二部分:內聯函數
從上面的闡述,可以看到宏有一些難以避免的問題,怎么解決呢?
內聯函數是代碼被插入到調用者代碼處的函數。如同 #define 宏,內聯函數通過避免被調用的開銷來提高執行效率,尤其是它能夠通過調用(“過程化集成”)被編譯器優化。
內聯函數和宏很類似,而區別在于,宏是由預處理器對宏進行替代,而內聯函數是通過編譯器控制來實現的。而且內聯函數是真正的函數,只是在需要用到的時候,內聯函數像宏一樣的展開,所以取消了函數的參數壓棧,減少了調用的開銷。你可以象調用函數一樣來調用內聯函數,而不必擔心會產生于處理宏的一些問題。
聲明內聯函數看上去和普通函數非常相似:
void f(int i, char c);
當你定義一個內聯函數時,在函數定義前加上 inline 關鍵字,并且將定義放入頭文件:
inline void f(int i, char c)
{
// ...
}
內聯函數必須是和函數體申明在一起,才有效。
像這樣的申明inline function(int i)是沒有效果的,編譯器只是把函數作為普通的函數申明,我們必須定義函數體。
inline int function(int i) {return i*i;}
這樣我們才算定義了一個內聯函數。我們可以把它作為一般的函數一樣調用。但是執行速度確比一般函數的執行速度要快。
當然,內聯函數也有一定的局限性。就是函數中的執行代碼不能太多了,如果,內聯函數的函數體過大,一般的編譯器會放棄內聯方式,而采用普通的方式調用函數。這樣,內聯函數就和普通函數執行效率一樣了。
有上面的兩者的特性,我們可以用內聯函數完全取代預處理宏。

感謝你能夠認真閱讀完這篇文章,希望小編分享的“編程語言中宏和內聯函數的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

开江县| 马山县| 潜江市| 阿克苏市| 武义县| 仁化县| 丹寨县| 丰县| 淮安市| 阿拉善盟| 宝坻区| 新安县| 米易县| 香港| 福鼎市| 和田县| 长春市| 高淳县| 西乡县| 宣化县| 土默特右旗| 乐亭县| 密云县| 阿尔山市| 嫩江县| 鄂尔多斯市| 上犹县| 洪泽县| 南乐县| 龙江县| 托克托县| 呼伦贝尔市| 平安县| 嵊泗县| 江川县| 中江县| 兴业县| 淮北市| 大关县| 漯河市| 陇川县|