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

深入解讀C++ 內(nèi)聯(lián)函數(shù)inline|nullptr

 更新時間:2024年07月18日 09:28:44   作者:Harper·Lee  
內(nèi)聯(lián)函數(shù):用** inline 修飾的函數(shù)叫做內(nèi)聯(lián)函數(shù),編譯時C++編譯器會在調(diào)用的地方展開內(nèi)聯(lián)函數(shù)**,這樣調(diào)用內(nèi)聯(lián)函數(shù)就需要創(chuàng)建棧楨,就提高效率了,這篇文章給大家介紹C++ 內(nèi)聯(lián)函數(shù)inline|nullptr的相關(guān)知識,感興趣的朋友跟隨小編一起看看吧

一、inline關(guān)鍵字

1.1 什么是內(nèi)聯(lián)函數(shù)?

內(nèi)聯(lián)函數(shù):用** inline 修飾的函數(shù)叫做內(nèi)聯(lián)函數(shù),編譯時C++編譯器會在調(diào)用的地方展開內(nèi)聯(lián)函數(shù)**,這樣調(diào)用內(nèi)聯(lián)函數(shù)就需要創(chuàng)建棧楨,就提高效率了。

1.2 為什么會有內(nèi)聯(lián)函數(shù)?

1.2.1 回顧宏

主要目的就是為了替代C語言中的宏。先回顧一下什么是宏:

宏就是一種替換,右邊的替換掉左邊的;

#include<iostream>
using namespace std;
//right
#define ADD(x,y) ((x)+(y))//括起來
int main()
{
    int ret = ADD(1,2);//替換后:int ret = ((1)+(2));
    cout << ADD(1,2) << endl;
    return 0;
}

宏的末尾不能加分號,否則 ; 對語句造成干擾,出現(xiàn)語法錯誤。

#include<iostream>
using namespace std;
//如果加了分號
#define ADD(x,y) ((x)+(y));
int main()
{
    int ret = ADD(1,2);//替換后:int ret = ((1)+(2));
    cout << ADD(1,2); << endl;//error
    return 0;
}

宏用于替換的表達式一定加整體括號。

C語言中宏的缺點:

  • 不能進行調(diào)試(預(yù)處理時宏就被處理掉了)。
  • 沒有類型安全的檢查。
  • 缺一個括號都容易出現(xiàn)錯誤。有里面的括號,也有外層的括號。括號的優(yōu)先級最高。
  • 復(fù)雜時容易寫錯。例如一個加法函數(shù):
//right
#define ADD(x,y) ((x)+(y))//括起來
int main()
{
    int ret = ADD(1,2);//替換后:int ret = ((1)+(2));
    return 0;
}
//error
#define ADD(x,y) (x+y)
#define ADD(x,y) (x)+(y)
#define ADD(x,y) (x+y)
#define ADD(x,y) ((x)+(y));//不能加分號
#define ADD(int x,int y) return x+y;//不能加分號;

1.2.2 宏的改進–內(nèi)聯(lián)函數(shù)

根據(jù)上面的回顧可知,宏的問題缺陷很多,因此C++將它改進為一種函數(shù)——內(nèi)聯(lián)函數(shù)。
C語言實現(xiàn)宏函數(shù)時,也會在預(yù)處理是替換展開,但是宏函數(shù)實現(xiàn)很復(fù)雜很容易出錯,而且不方便調(diào)試,C++設(shè)計實現(xiàn) inline 的目的就是替代C的宏函數(shù)。

1.3 內(nèi)聯(lián)函數(shù)的特性

宏不能進行調(diào)試,但是內(nèi)聯(lián)函數(shù)可以。宏的原理是直接替換,內(nèi)聯(lián)函數(shù)的原理根據(jù)反匯編研究。

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

inline 對于編譯器而言只是一個建議,不同編譯器關(guān)于 inline 什么情況展開各不相同。也就是說,就算加了 inline,編譯器也可以選擇在調(diào)用的地方不展開。因為C++標準沒有規(guī)定這個。一般建議:將函數(shù)規(guī)模較小(即函數(shù)不是很長,具體沒有準確的說法,取決于編譯器內(nèi)部實現(xiàn))、不是遞歸、且頻繁調(diào)用的函數(shù)采用inline修飾,否則編譯器會忽略inline特性,直接選擇調(diào)用該函數(shù),不再展開。

**VS編譯器debug版本下默認是不展開 inline 的,這樣方便調(diào)試。**讓編譯器展開 inline 內(nèi)聯(lián)函數(shù)的具體操作如下:(兩個地方改動)編譯器無條件展開其實是有條件的 :如果某個大函數(shù)有許多地方都在調(diào)用,若每個位置都展開,函數(shù)的合計展開次數(shù)就會很大,指令就會非常多。大函數(shù)進行內(nèi)聯(lián)展開,編譯的可執(zhí)行程序變大,用戶體驗感變差。

a.

b.

**inline 不建議聲明和定義分離到兩個文件,分離會導致鏈接錯誤。C++編譯器默認不需要函數(shù)地址。**所以 inline 被展開,沒有函數(shù)地址,鏈接時就會出現(xiàn)報錯。也就是說,**加了inline的函數(shù)會讓編譯器認為這并不是一個函數(shù),所以不會被存到函數(shù)調(diào)用符號表里,因此不能將聲明和定義分離!!**正確做法:將inline的聲明和定義都放在頭文件里!這樣子在預(yù)處理的時候該定義就會被放到執(zhí)行文件里。

// F.h
#include <iostream>
using namespace std;
inline void f(int i);//聲明
// F.cpp
#include "F.h"
void f(int i)//定義
{
	cout << i << endl;
}
// main.cpp
#include "F.h"
int main()
{
	// 鏈接錯誤:?法解析的外部符號 
	f(10);//鏈接:但是.h文件中函數(shù)的聲明被inline修飾了,就沒有函數(shù)地址 
	return 0;
}

二、指針空值nullptr

2.1 C和C++中NULL的含義

NULL實際上是一個宏NULL,在傳統(tǒng)C語言文件stddef.h中,可以看到如下代碼:

#ifndef NULL
#ifdef __cplusplus
#define NULL  0
#else
#define NULL  ((void *)0)
#endif
#endif

由上面的代碼可以看出,NULL可能被定義為是字面常量0,或者被定義為是無類型指針(void)的常量。這兩種定義在使用空值指針時,就會出現(xiàn)歧義。比如下面:*

#include<iostream>
using namespace std;
void f(int x)
{
	cout << "f(int x)" << endl;
}
void f(int* ptr)
{
	cout << "f(int* ptr)" << endl;
}
int main()
{
	f(0);
	// 本想通過f(NULL)調(diào)?指針版本的f(int*)函數(shù),但是由于NULL被定義成0,調(diào)?了f(intx),因此與程序的初衷相悖。
	f(NULL);
	f((int*)NULL);//NULL寫成0也可以
	// f((void*)NULL);//強轉(zhuǎn)成void*,編譯報錯:error C2665: “f”: 2 個重載中沒有?個可以轉(zhuǎn)換所有參數(shù)類型
    f(nullptr);
	return 0;
}

運行結(jié)果:

image.png

根據(jù)運行結(jié)果可知,NULL被定義為0,就沒有調(diào)用指針版本的 f(int*) 函數(shù)。
為了解決這個問題,C++11中引入了一個特殊的關(guān)鍵字——nullptr,這樣就可以調(diào)用該函數(shù)了。

2.2 nullptr的特點

nullptr有以下幾個特點:

nullptr是一種特殊類型的字面量,它可以轉(zhuǎn)化成任一其他類型的指針類型。

使用nullptr定義空指針可以避免類型轉(zhuǎn)換的問題,因為nullptr只能被隱式轉(zhuǎn)換位指針類型,而不能轉(zhuǎn)換成整數(shù)類型。

int* p1 = nullptr;  //right
int i = nullptr;    //error

2.3 C和C++中void*的區(qū)別

上面的例子代碼中,f(void*) NULL;會報錯,報錯原因分析:C語言中 void 指針是一個垃圾桶,什么類型的指針都可以接受;C++中 void 指針需要進行強制類型轉(zhuǎn)換。**

//test.c
void* p1 = NULL;   //p1表示空指針
void* p2 = p1;     //right,不用強轉(zhuǎn)
//test.cpp
void* p3 = NULL;
int* p4 = p3;      //error
int* p5 = (int*)p3;//right,需要強轉(zhuǎn)

到此這篇關(guān)于C++ 內(nèi)聯(lián)函數(shù)inline|nullptr的文章就介紹到這了,更多相關(guān)C++ 內(nèi)聯(lián)函數(shù)inline|nullptr內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • c語言中的二級指針做函數(shù)參數(shù)說明

    c語言中的二級指針做函數(shù)參數(shù)說明

    這篇文章主要介紹了c語言中的二級指針做函數(shù)參數(shù)說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • C++實現(xiàn)一個簡單的線程池的示例代碼

    C++實現(xiàn)一個簡單的線程池的示例代碼

    本文主要介紹了C++實現(xiàn)一個簡單的線程池的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-05-05
  • C 語言指針概念的詳解

    C 語言指針概念的詳解

    這里主要介紹C 語言指針,這里整理了詳細的資料,對指針做了詳細說明及簡單示例代碼幫助大家理解什么是指針,有興趣的小伙伴可以參考下
    2016-08-08
  • 在C++中測量代碼執(zhí)行時間的兩種方法

    在C++中測量代碼執(zhí)行時間的兩種方法

    在C++中,編寫代碼只是第一步,衡量代碼的效率同樣重要,你如何知道你的 sort 算法比同事寫的快?或者你的新功能導致了多少性能下降?你需要一個秒表來精確測量代碼的執(zhí)行時間,本文給大家介紹了在C++中測量代碼執(zhí)行時間的兩種方法,需要的朋友可以參考下
    2026-01-01
  • C++實現(xiàn)LeetCode(33.在旋轉(zhuǎn)有序數(shù)組中搜索)

    C++實現(xiàn)LeetCode(33.在旋轉(zhuǎn)有序數(shù)組中搜索)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(33.在旋轉(zhuǎn)有序數(shù)組中搜索),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語言實現(xiàn)循環(huán)隊列基本操作

    C語言實現(xiàn)循環(huán)隊列基本操作

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)循環(huán)隊列基本操作,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 詳解如何利用C++實現(xiàn)一個反射類

    詳解如何利用C++實現(xiàn)一個反射類

    這篇文章主要為大家詳細介紹了如何利用C++實現(xiàn)一個反射類,文中的示例代碼講解詳細,具有一定的參考價值,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-03-03
  • C++項目開發(fā)實現(xiàn)圖書管理系統(tǒng)

    C++項目開發(fā)實現(xiàn)圖書管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C++項目開發(fā)實現(xiàn)圖書管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C++將txt文件內(nèi)容保存到數(shù)組的方法

    C++將txt文件內(nèi)容保存到數(shù)組的方法

    今天小編就為大家分享一篇C++將txt文件內(nèi)容保存到數(shù)組的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • 詳解C++-二階構(gòu)造模式、友元

    詳解C++-二階構(gòu)造模式、友元

    這篇文章主要介紹了C++-二階構(gòu)造模式、友元,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03

最新評論

德惠市| 天门市| 保定市| 文登市| 平陆县| 庆元县| 镇沅| 四会市| 青田县| 海南省| 柞水县| 读书| 基隆市| 光泽县| 阿拉善左旗| 沾化县| 虹口区| 邹城市| 长宁区| 临猗县| 灵台县| 巴彦淖尔市| 南康市| 呼伦贝尔市| 洪洞县| 垫江县| 洛宁县| 岫岩| 个旧市| 鄂托克旗| 仙桃市| 阿拉善右旗| 镇宁| 正安县| 宾阳县| 精河县| 江北区| 余姚市| 尼玛县| 淮安市| 宁津县|