C++內(nèi)聯(lián)函數(shù)詳情
內(nèi)聯(lián)函數(shù)是C++
當(dāng)中為了提高程序運行效率的設(shè)計,老實講我沒有在其他語言當(dāng)中看到類似的設(shè)計。它和常規(guī)函數(shù)之間的主要區(qū)別不在于編寫的方式,而是在于C++
編譯器會將內(nèi)聯(lián)函數(shù)組合到程序當(dāng)中執(zhí)行。
要解釋這個過程會稍稍有些復(fù)雜,我們需要從編譯的過程說起。對于編譯型語言而言,編譯器做的事情是把人類寫出來人能讀懂的代碼翻譯成機器能夠識別、執(zhí)行的機器語言,一般是一串十六進制的指令。隨后計算機逐步執(zhí)行這些指令,完成我們想要的功能。
當(dāng)我們調(diào)用函數(shù)時,其實本質(zhì)上是指令跳轉(zhuǎn),先記錄下當(dāng)前運行的指令位置,跳轉(zhuǎn)到函數(shù)所在的指令位置進行執(zhí)行,執(zhí)行完成之后再跳轉(zhuǎn)回來。這個當(dāng)中除了跳轉(zhuǎn)之外,還會發(fā)生一些參數(shù)的傳遞和拷貝,需要一定的開銷。
而使用內(nèi)聯(lián)函數(shù),本質(zhì)上可以理解成使用相應(yīng)的函數(shù)代碼代替了函數(shù)調(diào)用。可以簡單理解成把函數(shù)當(dāng)中的代碼拷貝了一份粘貼到了函數(shù)調(diào)用的位置,代替了函數(shù)跳轉(zhuǎn)。舉個例子,比如說我們有一個函數(shù)來計算坐標到原點的距離:
include<cmath> double distance(double x, double y) { return sqrt(x * x + y * y); } double x = 3.0, y = 4.0; double d = distance(x, y);
當(dāng)我們使用了內(nèi)聯(lián)函數(shù)之后,它相當(dāng)于把函數(shù)的代碼拷貝了一份粘貼到了調(diào)用的位置:
double x = 3.0, y = 4.0; double d = sqrt(x * x + y * y);
這也就是內(nèi)聯(lián)的含義,使用了內(nèi)聯(lián)函數(shù)之后,程序無須跳轉(zhuǎn)到另外一個位置進行執(zhí)行,可以節(jié)省掉跳轉(zhuǎn)所帶來的開銷。因此運行效率要比普通函數(shù)更快,但代價是需要占用更多的內(nèi)存。比如我們調(diào)用了10次內(nèi)聯(lián)函數(shù),相當(dāng)于代碼拷貝了十份。
內(nèi)聯(lián)函數(shù)的使用非常簡單,就是在函數(shù)定義之前加上inline
關(guān)鍵字。
需要注意的是,有的時候我們雖然加上了inline
關(guān)鍵字但編譯器并不一定會遵照執(zhí)行。有些編譯器會有函數(shù)規(guī)模的限制,并且會限制內(nèi)聯(lián)函數(shù)禁止調(diào)用自己,也就是不能遞歸。
還有一點是內(nèi)聯(lián)函數(shù)雖然有內(nèi)聯(lián)機制,但是函數(shù)的傳參依然是值傳遞,也就是說會發(fā)生拷貝,和普通函數(shù)一致。
在C語言當(dāng)中沒有inline
特性,C語言是使用宏定義來實現(xiàn)類似的功能。但宏定義并不是通過參數(shù)傳遞,而是代替機械替換實現(xiàn)的。
比如:
#define SQUARE(x) x*x double a = SQUARE(3.4 + 3.5);
這樣我們得到的結(jié)果會是3.4 + 3.5 * 3.4 + 3.5
,也就是說宏定義只是機械地替換代碼,并不是函數(shù)式的調(diào)用。所以要實現(xiàn)類似inline
函數(shù)的效果,可以使用括號:
#define SQUARE(x) ((x) * (x))
到此這篇關(guān)于C++內(nèi)聯(lián)函數(shù)詳情的文章就介紹到這了,更多相關(guān)C++內(nèi)聯(lián)函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
出品 | 公眾號:Coder梁(ID:Coder_LT)
相關(guān)文章
c語言循環(huán)加數(shù)組實現(xiàn)漢諾塔問題
本文主要介紹了c語言循環(huán)加數(shù)組實現(xiàn)漢諾塔問題,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01C++?this原理與可變參數(shù)及友元函數(shù)友元類分步詳解用法
可變參數(shù)模板(variadic?templates)是C++11新增的強大的特性之一,它對模板參數(shù)進行了高度泛化,能表示0到任意個數(shù)、任意類型的參數(shù),這篇文章主要介紹了C++?this原理與可變參數(shù)及友元函數(shù)友元類2022-11-11C++ 將數(shù)據(jù)轉(zhuǎn)為字符串的幾種方法
這篇文章主要介紹了C++ 將數(shù)據(jù)轉(zhuǎn)為字符串的幾種方法,十分的實用,有需要的小伙伴可以參考下。2015-06-06c++指針參數(shù)傳遞和引用參數(shù)傳遞的區(qū)別解析
這篇文章主要介紹了c++指針參數(shù)傳遞和引用參數(shù)傳遞的區(qū)別解析,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-07-07