最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++inline函數的特性你了解嗎

 更新時間:2022年03月17日 10:51:23   作者:guo5411  
這篇文章主要為大家詳細介紹了C++的inline函數,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

一.inline的作用(內聯函數)

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

內聯函數的定義:

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

上面這個就是一個內聯函數,假如我們的程序中頻繁使用add操作時,將其聲明為內聯函數就可以減少調用開銷提高效率.

注意: 

1.inline關鍵字是一種"用于實現的關鍵字",而不是"用于聲明的關鍵字", 換句話說inline只有放在函數的定義前,才有可能使該函數成為內聯函數,放在函數聲明前無效.

2.另外一點是:在c++的類中定義的成員函數默認就是內聯函數,但前提是在類中定義,因為我們正常的定義類的方式是在頭文件中聲明類的成員變量和成員函數,在原文件中對類的成員函數進行定義,此時成員函數的定義發(fā)生在類外,所以自然就不再是內聯函數了,如果還要讓其成為內聯函數,就需要我們手動添加inline.

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

二.inline的實現(注意debug模式下內聯函數不會展開)

既然內聯函數可以減小函數的調用開銷,那么他是怎么實現的呢?非常簡單,我們在所有調用內聯函數的地方將其代碼展開,這樣雖然會使代碼的的量增加,但是減少了調用的開銷,是一種典型的空間換時間的做法.

我們將編譯器調到Release模式下使用內聯函數,在匯編指令下就能看見其實現的方式.

源碼:

#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模式)反匯編:

在debug模式下我們可以清楚的看到,在程序運行到add函數時,進行了2和1兩個參數的壓棧,以及add函數的調用.

(Release模式)反匯編:

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

三.使用inline的注意事項

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

源碼:

#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模式)反匯編:

此時在Release模式的反匯編指令中我們看到mul函數并沒有被展開,而是進行了函數調用,說明編譯器并沒有將其變?yōu)閮嚷摵瘮?

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

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

總結

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內容!

相關文章

  • C++學習之指針的使用詳解

    C++學習之指針的使用詳解

    這篇文章主要為大家詳細介紹了C++中指針的相關知識,文中的示例代碼講解詳細,對我們的學習或工作有一定的價值,感興趣的小伙伴可以了解一下
    2023-03-03
  • 重學c/c++之數據存儲詳解(整數、浮點數)

    重學c/c++之數據存儲詳解(整數、浮點數)

    C語言給定了一些基本的數據類型,下面這篇文章主要給大家介紹了關于重學c/c++之數據存儲(整數、浮點數)的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-11-11
  • MFC命名規(guī)則匯總

    MFC命名規(guī)則匯總

    這篇文章主要介紹了MFC命名規(guī)則,對于初學者而言需要牢固掌握這類規(guī)則,需要的朋友可以參考下
    2014-07-07
  • floyd算法實現思路及實例代碼

    floyd算法實現思路及實例代碼

    這篇文章主要介紹了floyd算法實現思路及實例代碼,有需要的朋友可以參考一下
    2014-01-01
  • C++和java設計模式之單例模式

    C++和java設計模式之單例模式

    這篇文章主要為大家詳細介紹了C++和java設計模式之單例模式的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • C++中MFC Tab Control控件的使用詳解

    C++中MFC Tab Control控件的使用詳解

    這篇文章主要介紹了C++中MFC Tab Control控件的使用詳解的相關資料,需要的朋友可以參考下
    2015-06-06
  • 輸入一個字符串,取出其中的整數(實現代碼)

    輸入一個字符串,取出其中的整數(實現代碼)

    輸入一個字符串,內含所有數字和非數字字符。將其中連續(xù)的數字作為一個整數,依次存放到一個數組中,統計共有多少個整數,并輸出這些數
    2013-09-09
  • C語言實現BST二叉排序樹的基本操作

    C語言實現BST二叉排序樹的基本操作

    這篇文章主要為大家詳細介紹了C語言實現BST二叉排序樹的基本操作,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • C++的dynamic示例代碼詳解

    C++的dynamic示例代碼詳解

    在C++編程中,dynamic_cast 是處理多態(tài)類型轉換的關鍵工具,允許在復雜繼承結構中安全地將基類指針或引用轉換為派生類指針或引用,這篇文章主要介紹了C++的dynamic,需要的朋友可以參考下
    2024-08-08
  • C++設計模式之工廠模式

    C++設計模式之工廠模式

    本文是C++設計模式系列文章的第一篇,主要給大家講述下工廠模式,非常的簡單實用,有需要的小伙伴可以參考下
    2016-05-05

最新評論

江西省| 南川市| 浦县| 朝阳市| 黄浦区| 峡江县| 宁德市| 天台县| 历史| 化州市| 韶关市| 乌兰浩特市| 武胜县| 安化县| 清原| 方城县| 剑川县| 克山县| 娄底市| 拉萨市| 三台县| 辉南县| 宜章县| 炉霍县| 盐源县| 广南县| 遵义市| 广平县| 承德市| 抚顺市| 女性| 固原市| 固阳县| 奈曼旗| 堆龙德庆县| 南安市| 抚顺县| 东城区| 廉江市| 辽阳县| 绵竹市|