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

C++深入探索內聯(lián)函數(shù)inline與auto關鍵字的使用

 更新時間:2022年05月16日 11:33:25   作者:小白又菜  
本篇文章主要包括內聯(lián)函數(shù)和auto關鍵字。其中,內斂函數(shù)包括概念,特性等;auto關鍵字的使用規(guī)則,使用場景等,接下來讓我們深入了解

1.內斂函數(shù)

1.1問題引入

我們在使用C語言中我們都學過函數(shù),我們知道函數(shù)在調用的過程中需要開辟棧幀。如果我們需要頻繁的調用一個函數(shù),假設我們調用10次Add()函數(shù),那我們就需要建立10次棧幀。我們都知道在棧幀中要做很多事情,例如保存寄存器,壓參數(shù),壓返回值等等,這個過程是很麻煩的。那在C語言中,我們可以通過宏來解決這個問題。在C++中,我們便引入了內斂函數(shù)(inline)。

1.2內聯(lián)函數(shù)的概念

以inline修飾的函數(shù)叫做內聯(lián)函數(shù),編譯時C++編譯器會在調用內聯(lián)函數(shù)的地方展開,沒有函數(shù)壓棧的開銷,內聯(lián)函數(shù)提升程序運行的效率。

我們這里依然使用Add()函數(shù)舉例。這段代碼是我們常寫的Add()函數(shù)。假設我們多次調用Add函數(shù),在C語言中,我們可以使用宏替換。在C++我們可以在函數(shù)前加上inline

int Add(int x, int y)
{
	int z = x + y;
	return z;
}

C語言中用宏來代替Add函數(shù):

#define Add(x,y) ((x)+(y))

C++中在函數(shù)前加上inline使之成為內聯(lián)函數(shù)

inline int Add(int x, int y)
{
	int z = x + y;
	return z;
}

那C語言已經(jīng)有了宏替換,為什么C++還要出現(xiàn)內聯(lián)函數(shù)呢?

主要是有兩個原因:

1.宏晦澀難懂不好控制,特別容易寫錯.語法機制設計不好。

2.宏不支持調試,但是內斂在debug下支持調試(在debug下不會展開,在release下才會展開),這樣我們對代碼的理解和掌握將大大提高。

如果在Add函數(shù)前增加 inline 關鍵字將其改成內聯(lián)函數(shù),在編譯期間編譯器會用函數(shù)體替換函數(shù)的調用。 查看方式:

1. 在 release 模式下,查看編譯器生成的匯編代碼中是否存在 call Add

2. 在 debug 模式下,需要對編譯器進行設置,否則不會展開 ( 因為 debug 模式下,編譯器默認不會對代碼進 行優(yōu)化,以下給出 vs2019 的設置方式 )

1.3內斂函數(shù)的特性

1. inline 是一種 以空間換時間 的做法,省去調用函數(shù)額開銷。所以 代碼很長 或者有 循環(huán) / 遞歸 的函數(shù)不適宜使用作為內聯(lián)函數(shù)。

2. inline 對于編譯器而言只是一個建議 ,編譯器會自動優(yōu)化,如果定義為 inline 的函數(shù)體內有循環(huán) / 遞歸等等,編譯器優(yōu)化時會忽略掉內聯(lián)。

3. inline 不建議聲明和定義分離,分離會導致鏈接錯誤。因為 inline 被展開,就沒有函數(shù)地址了,鏈接就會找不到

  • inline是一種以空間換時間的做法,省去調用函數(shù)額開銷(建立棧幀).所以代碼很長或者遞歸的函數(shù)不適宜用內聯(lián)函數(shù).

這里代碼多長算長呢? 一般是10行左右,具體取決于編譯器。

  • inline對于編譯器而言只是一個建議,編譯器會自動優(yōu)化,如果定義為inline的函數(shù)體內有循環(huán)/遞歸等等,編譯器優(yōu)化時會忽略掉內聯(lián)。

這里可以舉個例子,假設我們有一個代碼需要10行,但是我們需要調用1000次。如果inline替換的話,我們要有1000*10條指令,如果不替換則有1000+10條指令。因此最終是否替換,取決于編譯器。

inline int Add(int x, int y)
{
	int z = x + y;
	z += x * y;
	z += x * y;
	z += x * y;
	z += x * y;
	z += x * y;
	z += x * y;
	z += x * y;
	z += x * y;
	z += x * y;
	z += x * y;
	z += x * y;
	return z;
}

我們發(fā)現(xiàn),雖然Add函數(shù)前加了inline,但是最終卻沒有展開。

  • inline不建議聲明和定義分離,分離會導致鏈接錯誤。因為inline被展開,就沒有函數(shù)地址了,鏈接就會找不到

我們在f.cpp中調用一下:發(fā)現(xiàn)報錯了

在這里他就會發(fā)生鏈接錯誤:

這是因為test.h中替換到test.cpp中發(fā)現(xiàn)是內聯(lián)函數(shù),內聯(lián)函數(shù)不需要生成地址,因為內聯(lián)函數(shù)調用的地方都展開了,因此不會存在在符號表中。外部調用時就找不到。因此不要將聲明和定義分開。

2.auto關鍵字

2.1 auto簡介

在早期 C/C++ 中 auto 的含義是:使用 auto 修飾的變量,是具有自動存儲器的局部變量。C++11中,標準委員會賦予了auto 全新的含義即: auto 不再是一個存儲類型指示符,而是作為一個新的類型 指示符來指示編譯器, auto 聲明的變量必須由編譯器在編譯時期推導而得

auto在C語言中我們是接觸過的:最寬宏大量的關鍵字,由于局部變量默認都是auto修飾的,因此auto可以省略,這就導致auto常常被人忽略。那么在C++11中,auto進行了升級,有了新的功能--自動推導。(注意:auto新功能只是在C++11之后才有此功能)

那么auto是怎么自動推導呢?

我們可以使用typeid,來打印一個變量的類型。

int main()
{
    const int  a = 10;
	auto b = &a;
	auto c = 'a';
	cout << typeid(b).name() << endl;//typeid可以打印一個變量的類型
	cout << typeid(a).name() << endl;//typeid可以打印一個變量的類型
	cout << typeid(c).name() << endl;//typeid可以打印一個變量的類型
	return 0;
}

我們發(fā)現(xiàn)auto的自動推導還是很智能的。

auto意義之一:類型很長時,懶得寫,可以讓他自動推導

注意:

使用 auto 定義變量時必須對其進行初始化,在編譯階段編譯器需要根據(jù)初始化表達式來推導 auto 的實際類 型 。因此 auto 并非是一種 “ 類型 ” 的聲明,而是一個類型聲明時的 “ 占位符 ” ,編譯器在編譯期會將 auto 替換為 變量實際的類型 。

2.2 auto的使用細則

1. auto與指針和引用結合起來使用auto聲明指針類型時,用auto和auto*沒有任何區(qū)別,但用auto聲明引用類型時則必須加&.

int main()
{
	int x = 10;
	auto a = &x;
	auto& c = x;
	cout << typeid(x).name() << endl;//typeid可以打印一個變量的類型
	cout << typeid(a).name() << endl;//typeid可以打印一個變量的類型
	cout << typeid(c).name() << endl;//typeid可以打印一個變量的類型
	return 0;
}

2. 在同一行定義多個變量當在同一行聲明多個變量時,這些變量必須是相同的類型,否則編譯器將會報錯,因為編譯器實際只對第一個類型進行推導,然后用推導出來的類型定義其他變量。

	auto a = 1, b = 2;
	auto c = 3, d = 4.0;//c和d類型不同,auto推導會沖突的

2.3 auto不能推導的場景

1. auto不能作為函數(shù)的參數(shù)

// 此處代碼編譯失敗,auto不能作為形參類型,因為編譯器無法對a的實際類型進行推導
void TestAuto(auto a)
{}

2. auto不能直接用來聲明數(shù)組

void TestAuto()
{
	int a[] = { 1,2,3 };
	auto b[] = { 4,5,6 };
}

2.4 auto與新式for循環(huán)使用

在平常我們打印一個array數(shù)組,我們需要依次打印遍歷。如下代碼所示:

int main()
{
	int array[] = { 1,2,3,4,5 };
	for (int i = 0; i < sizeof(array) / sizeof(int); ++i)
		array[i] *= 2;
	for (int i = 0; i < sizeof(array) / sizeof(int); ++i)
		cout << array[i] << " ";
	cout << endl;
	return 0;
}

我們也可以使用auto結合范圍for循環(huán)打印這個數(shù)組:

	for (auto e : array)
		cout << e << " ";
	cout << endl;

在這里我們使用到了一個新的for循環(huán),范圍for。它會依次自動取array中的數(shù)據(jù),賦值給e,并且會自動判斷結束,因此我們使用auto可以自動識別數(shù)組元素的類型。

注意:e只是array的拷貝,改變e不會改變array數(shù)組的內容。如果我們想改變array的內容,只需要加個引用即可,意思是讓e成為array的別名,代碼如下:

	//加個引用就可以訪問到array
	for (auto& e : array)
	{
		e /= 2;
	}
	for (auto e : array)
		cout << e << " ";

到此這篇關于C++深入探索內聯(lián)函數(shù)inline與auto關鍵字的使用的文章就介紹到這了,更多相關C++ inline與auto內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C語言算法的定義及分析詳解

    C語言算法的定義及分析詳解

    這篇文章主要為大家詳細介紹了C語言算法的定義及分析,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • C++實現(xiàn)“隱藏實現(xiàn),開放接口”的方案

    C++實現(xiàn)“隱藏實現(xiàn),開放接口”的方案

    本文從一個實例講解了C++實現(xiàn)“隱藏實現(xiàn),開放接口”的方案,文章條理清新,內容充實,需要的朋友可以參考下
    2015-07-07
  • C語言中怎么在main函數(shù)開始前執(zhí)行函數(shù)

    C語言中怎么在main函數(shù)開始前執(zhí)行函數(shù)

    C語言中怎么在main函數(shù)開始前執(zhí)行函數(shù)呢?下面小編就大家詳細的介紹一下。需要的朋友可以過來參考下,希望對大家有所幫助
    2013-10-10
  • C語言打印楊輝三角示例匯總

    C語言打印楊輝三角示例匯總

    本文給大家匯總了2種使用C語言實現(xiàn)楊輝三角的方法,不過還是給大家推薦第一種,希望大家能夠喜歡。
    2016-02-02
  • 關于C語言中E-R圖的詳解

    關于C語言中E-R圖的詳解

    今天小編就為大家分享一篇關于關于C語言中E-R圖的詳解,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • C語言中strcpy()函數(shù)的具體實現(xiàn)及注意事項

    C語言中strcpy()函數(shù)的具體實現(xiàn)及注意事項

    C語言庫函數(shù)char *strcpy(char *dest, const char *src)把src所指向的字符串復制到dest,下面這篇文章主要給大家介紹了關于C語言中strcpy()函數(shù)的具體實現(xiàn)及注意事項的相關資料,需要的朋友可以參考下
    2022-11-11
  • 詳解C++設計模式編程中建造者模式的實現(xiàn)

    詳解C++設計模式編程中建造者模式的實現(xiàn)

    這篇文章主要介紹了C++設計模式編程中建造者模式的實現(xiàn),建造者模式將一個復雜對象的構建于它的表現(xiàn)分離,可以減少代碼冗余,需要的朋友可以參考下
    2016-03-03
  • Cocos2d-x 3.x入門教程(一):基礎概念

    Cocos2d-x 3.x入門教程(一):基礎概念

    這篇文章主要介紹了Cocos2d-x 3.x入門教程(一):基礎概念,本文講解了Director、Scene、Layer、Sprite等內容,需要的朋友可以參考下
    2014-11-11
  • C語言實現(xiàn)掃雷程序

    C語言實現(xiàn)掃雷程序

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)掃雷程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • C語言實現(xiàn)三子棋的步驟和代碼詳解

    C語言實現(xiàn)三子棋的步驟和代碼詳解

    這篇文章主要介紹了C語言實現(xiàn)三子棋的步驟和代碼詳解,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12

最新評論

湄潭县| 灌南县| 宁乡县| 左权县| 大厂| 巫溪县| 保山市| 建瓯市| 军事| 新巴尔虎左旗| 崇信县| 石楼县| 宜春市| 兴隆县| 新安县| 简阳市| 正安县| 浙江省| 蓝山县| 甘孜县| 惠安县| 嘉鱼县| 策勒县| 甘谷县| 台东县| 汉中市| 黄龙县| 呼伦贝尔市| 内乡县| 卓资县| 沧源| 军事| 遂宁市| 西华县| 平湖市| 梨树县| 奇台县| 巨野县| 山东| 镇原县| 广丰县|