溫馨提示×

溫馨提示×

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

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

C++inline函數(shù)的特性是什么

發(fā)布時(shí)間:2022-03-17 13:35:07 來源:億速云 閱讀:177 作者:小新 欄目:開發(fā)技術(shù)

這篇文章給大家分享的是有關(guān)C++inline函數(shù)的特性是什么的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。

一.inline的作用(內(nèi)聯(lián)函數(shù))

我們使用關(guān)鍵字inline和函數(shù)定義一起就可以創(chuàng)建一個(gè)內(nèi)聯(lián)函數(shù),它的作用就是減少函數(shù)調(diào)用的開銷,假如我們的程序中有一個(gè)函數(shù)會(huì)頻繁的被調(diào)用,這樣使程序的運(yùn)行速度十分緩慢,那么我們使用內(nèi)聯(lián)函數(shù),就可以解決這種問題,提高程序的運(yùn)行效率.

內(nèi)聯(lián)函數(shù)的定義:

inline void add(int a, int b){
    return a+b;
}

上面這個(gè)就是一個(gè)內(nèi)聯(lián)函數(shù),假如我們的程序中頻繁使用add操作時(shí),將其聲明為內(nèi)聯(lián)函數(shù)就可以減少調(diào)用開銷提高效率.

注意: 

1.inline關(guān)鍵字是一種"用于實(shí)現(xiàn)的關(guān)鍵字",而不是"用于聲明的關(guān)鍵字", 換句話說inline只有放在函數(shù)的定義前,才有可能使該函數(shù)成為內(nèi)聯(lián)函數(shù),放在函數(shù)聲明前無效.

2.另外一點(diǎn)是:在c++的類中定義的成員函數(shù)默認(rèn)就是內(nèi)聯(lián)函數(shù),但前提是在類中定義,因?yàn)槲覀冋5亩x類的方式是在頭文件中聲明類的成員變量和成員函數(shù),在原文件中對類的成員函數(shù)進(jìn)行定義,此時(shí)成員函數(shù)的定義發(fā)生在類外,所以自然就不再是內(nèi)聯(lián)函數(shù)了,如果還要讓其成為內(nèi)聯(lián)函數(shù),就需要我們手動(dòng)添加inline.

3.至于第一點(diǎn)中我為什么要說可能使該函數(shù)成為內(nèi)聯(lián)函數(shù),是因?yàn)閕nline是一種推薦型關(guān)鍵字,他并不保證該函數(shù)一定會(huì)成為內(nèi)聯(lián)函數(shù),而是編譯器在編譯的時(shí)候獲取有inline建議的函數(shù)對其規(guī)模,內(nèi)容,方法等要素進(jìn)行判斷,如果滿足編譯器要求該函數(shù)會(huì)成為內(nèi)聯(lián)函數(shù),反之不會(huì)成為內(nèi)聯(lián)函數(shù),因此成不成內(nèi)聯(lián)函數(shù)完全由編譯器說了算.

二.inline的實(shí)現(xiàn)(注意debug模式下內(nèi)聯(lián)函數(shù)不會(huì)展開)

既然內(nèi)聯(lián)函數(shù)可以減小函數(shù)的調(diào)用開銷,那么他是怎么實(shí)現(xiàn)的呢?非常簡單,我們在所有調(diào)用內(nèi)聯(lián)函數(shù)的地方將其代碼展開,這樣雖然會(huì)使代碼的的量增加,但是減少了調(diào)用的開銷,是一種典型的空間換時(shí)間的做法.

我們將編譯器調(diào)到Release模式下使用內(nèi)聯(lián)函數(shù),在匯編指令下就能看見其實(shí)現(xiàn)的方式.

源碼:

#include<iostream>
using namespace std;
inline int add(int a, int b) {
	return 0;
}
int main() {
	int b=add(1, 2);
	cout << b << endl;
	return 0;
}

(debug模式)反匯編:

C++inline函數(shù)的特性是什么

在debug模式下我們可以清楚的看到,在程序運(yùn)行到add函數(shù)時(shí),進(jìn)行了2和1兩個(gè)參數(shù)的壓棧,以及add函數(shù)的調(diào)用.

(Release模式)反匯編:

C++inline函數(shù)的特性是什么

此時(shí)我們可以看到,像之前的那種參數(shù)壓棧,函數(shù)調(diào)用沒有了,那就是內(nèi)聯(lián)函數(shù),實(shí)現(xiàn)成功了,在這里不會(huì)再繼續(xù)調(diào)用add函數(shù)了,而是將add函數(shù)直接展開,將其代碼放在這里直接進(jìn)行a+b的運(yùn)算,避免函數(shù)的調(diào)用,增加其運(yùn)行效率.

三.使用inline的注意事項(xiàng)

在上面我說到了,使用內(nèi)聯(lián)函數(shù)是一種消耗空間獲得時(shí)間的方法,因此我們得把握好其中的度,當(dāng)程序的規(guī)模過大時(shí),其代碼的運(yùn)行的開銷已經(jīng)遠(yuǎn)遠(yuǎn)超過我們函數(shù)調(diào)用的開銷時(shí),此時(shí)收益非常小,再使用內(nèi)聯(lián)函數(shù)就沒有必要了,并且函數(shù)內(nèi)存在遞歸或者循環(huán)時(shí)也不能使用內(nèi)聯(lián)函數(shù),編譯器也不會(huì)將其變?yōu)閮?nèi)聯(lián)函數(shù).

源碼:

#include<iostream>
using namespace std;
inline int mul(int a) {//求a的階乘
	if (a <= 0) {
		return 1;
	}
	return a * mul(a - 1);
}
int main() {
	int b=mul(10);
	cout << b << endl;
	return 0;
}

(Release模式)反匯編:

C++inline函數(shù)的特性是什么

此時(shí)在Release模式的反匯編指令中我們看到mul函數(shù)并沒有被展開,而是進(jìn)行了函數(shù)調(diào)用,說明編譯器并沒有將其變?yōu)閮?nèi)聯(lián)函數(shù).

四.inline和預(yù)處理的區(qū)別

我們知道預(yù)處理階段會(huì)發(fā)生宏替換這一行為,宏替換也就是將代碼中用到宏的地方用宏定義的代碼或數(shù)據(jù)與宏進(jìn)行替換,inline也是將函數(shù)中的代碼復(fù)制到調(diào)用內(nèi)聯(lián)函數(shù)的地方,那么他們有什么區(qū)別呢?宏替換只是單純的替換并不安全,而內(nèi)聯(lián)函數(shù)在使用的時(shí)候,編譯器會(huì)對內(nèi)聯(lián)函數(shù)調(diào)用的正確性進(jìn)行判斷如果不正確則該操作就不會(huì)發(fā)生,因此其更加安全,所以在c++中所有的宏代碼,都應(yīng)該使用內(nèi)聯(lián)函數(shù)進(jìn)行取代. 

感謝各位的閱讀!關(guān)于“C++inline函數(shù)的特性是什么”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI