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

C++11中內(nèi)聯(lián)函數(shù)(inline)用法實(shí)例

 更新時(shí)間:2022年10月31日 15:59:13   作者:BUG_C++  
內(nèi)聯(lián)函數(shù)本質(zhì)還是一個(gè)函數(shù),但在聲明的時(shí)候,函數(shù)體要和聲明結(jié)合在一起,否則編譯器將它作為普通函數(shù)來對(duì)待,下面這篇文章主要給大家介紹了關(guān)于C++11中內(nèi)聯(lián)函數(shù)(inline)的相關(guān)資料,需要的朋友可以參考下

inline 是什么?

inline是C++ 11引入的關(guān)鍵字,在函數(shù)聲明or定義時(shí),返回類型前加上關(guān)鍵字inline,即可以把函數(shù)指定為內(nèi)聯(lián)函數(shù)。

引入inline的目的是什么?

目的是解決一些頻繁調(diào)用的函數(shù)大量消耗??臻g(棧內(nèi)存)的問題。另一方面用于替換C語(yǔ)言的宏(相比較宏是無法在進(jìn)行類型檢查)

內(nèi)聯(lián)函數(shù)的特點(diǎn)

  • 內(nèi)聯(lián)函數(shù)的函數(shù)內(nèi)容本質(zhì)上是寫在調(diào)用內(nèi)聯(lián)函數(shù)的地方;
  • 內(nèi)聯(lián)函數(shù)本質(zhì)上沒有入棧出棧的開銷;
  • 和宏定義相比,內(nèi)聯(lián)函數(shù)更加安全,編譯器會(huì)根據(jù)函數(shù)的要求進(jìn)行嚴(yán)格的類型和作用域檢查,保證調(diào)用無誤;
  • 內(nèi)聯(lián)函數(shù)一般上不包含循環(huán)、遞歸、switch或較長(zhǎng)的代碼 等復(fù)雜操作;
  • 類聲明中定義的函數(shù),除虛函數(shù)外的其他函數(shù)都會(huì)自動(dòng)隱式地當(dāng)成內(nèi)聯(lián)函數(shù);

內(nèi)聯(lián)函數(shù)的寫法

這里的一個(gè)關(guān)鍵點(diǎn),inline必須與函數(shù)定義放在一起才能使函數(shù)成為內(nèi)聯(lián)函數(shù),僅將inline放在函數(shù)聲明前面不起任何作用。

inline是一種“用于實(shí)現(xiàn)”的關(guān)鍵字,不是一種“用于聲明”的關(guān)鍵字。

//在頭文件中可以進(jìn)行顯示聲明

//方式1 加 inline(建議使用)
inline int TestFunc(int a, int b);

//方式2 原始常見聲明方式
int TestFunc(int a, int b);

//在源文件中定義
//正確
inline int TestFunc(int a, int b){
    //do something
    return 0;
}
//錯(cuò)誤
int TestFunc(int a, int b){
    //do something
    return 0;
}

隱式內(nèi)聯(lián)和顯式內(nèi)聯(lián)

隱式內(nèi)聯(lián)的寫法

class CppObj {
    int TestFuncA() { return 0; }       //隱式內(nèi)聯(lián)
    vitrual int TestFuncB() { return 0; }    //虛函數(shù)不會(huì)進(jìn)行隱式內(nèi)聯(lián)   
}

顯式內(nèi)聯(lián)的寫法

class CppObj {
    int TestFuncA();
    inline int TestFuncB();
    vitrual int TestFuncC();
}
inline int CppObj::TestFuncA() {   //顯式內(nèi)聯(lián)
    return 0; 
} 

inline int CppObj::TestFuncB() {   //顯式內(nèi)聯(lián)
    return 0; 
} 

inline 函數(shù)的編譯器處理

inline函數(shù)僅僅是一個(gè)開發(fā)者對(duì)編譯器的建議,至于最后能否真正內(nèi)聯(lián),需要看編譯器的意思。如果編譯器判定函數(shù)不復(fù)雜,能在調(diào)用點(diǎn)展開,就會(huì)真正內(nèi)聯(lián)。

內(nèi)聯(lián)函數(shù)優(yōu)缺點(diǎn)

  • 優(yōu)點(diǎn)
    • 內(nèi)聯(lián)函數(shù)相比宏函數(shù)來說,在代碼調(diào)用時(shí)會(huì)做安全檢查和類型轉(zhuǎn)換(同普通函數(shù)),而宏定義則不會(huì);
    • 宏定義不可以在運(yùn)行時(shí)可調(diào)試,但內(nèi)聯(lián)函數(shù)可以;
    • 內(nèi)聯(lián)函數(shù)同宏函數(shù)一樣會(huì)在被調(diào)用處進(jìn)行展開,無需參數(shù)壓棧、棧幀開辟與回收,結(jié)果返回等,從而能提高代碼的運(yùn)行速度。
  • 缺點(diǎn)
    • 代碼膨脹。內(nèi)聯(lián)是以代碼膨脹(復(fù)制)為代價(jià),是典型的以空間換時(shí)間的做法。
    • 內(nèi)聯(lián)函數(shù)不可控。內(nèi)聯(lián)函數(shù)只是編碼者對(duì)編譯器的建議,是否對(duì)函數(shù)內(nèi)聯(lián),最終決定權(quán)在于編譯器。
    • inline 函數(shù)無法隨著函數(shù)庫(kù)升級(jí)而升級(jí)。inline函數(shù)的改變需要重新編譯,不像 non-inline 可以直接鏈接。

虛函數(shù)可以是內(nèi)聯(lián)函數(shù)嗎?

  • 虛函數(shù)可以是內(nèi)聯(lián)函數(shù);
  • inline是可以修飾虛函數(shù);

虛函數(shù)內(nèi)聯(lián)條件?

可以內(nèi)聯(lián)的條件,編譯器具有實(shí)際對(duì)象而不是對(duì)象的指針或引用時(shí)才會(huì),所以當(dāng)虛函數(shù)表現(xiàn)多態(tài)性的時(shí)候不能內(nèi)聯(lián)。

虛函數(shù)表現(xiàn)多態(tài)性的時(shí)候不能內(nèi)聯(lián)

內(nèi)聯(lián)是在編譯期進(jìn)行的,但虛函數(shù)的多態(tài)性在運(yùn)行期,所以編譯器無法知曉運(yùn)行期具體調(diào)用哪個(gè)代碼

代碼釋義

#include <iostream>
using namespace std;
class Base {
public:
	virtual ~Base() {}
	inline virtual void FuncName() { cout << "this is Base " << endl; }
};

class Derived : public Base {
public:
	inline virtual void FuncName() { cout << "this is Derived" << endl; }
};

int main()
{
	// 編譯器具有實(shí)際對(duì)象,所以它可以是內(nèi)聯(lián)的.
	Base b;
	b.FuncName();

	// 編譯器具有對(duì)象的指針,呈現(xiàn)多態(tài)性,運(yùn)行時(shí)期才能確定,所以不能內(nèi)聯(lián)。
	Base* p = new Derived();
	p->FuncName();

	delete p;
	p = nullptr;

	system("pause");
	return 0;
}

參考連接:

Are “inline virtual” member functions ever actually “inlined”?

總結(jié) 

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

相關(guān)文章

  • C++課程設(shè)計(jì)之學(xué)生成績(jī)管理系統(tǒng)

    C++課程設(shè)計(jì)之學(xué)生成績(jī)管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++課程設(shè)計(jì)之學(xué)生成績(jī)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • C++實(shí)現(xiàn)LeetCode(53.最大子數(shù)組)

    C++實(shí)現(xiàn)LeetCode(53.最大子數(shù)組)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(53.最大子數(shù)組),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語(yǔ)言獲取Shell返回結(jié)果的實(shí)現(xiàn)方法

    C語(yǔ)言獲取Shell返回結(jié)果的實(shí)現(xiàn)方法

    下面小編就為大家?guī)硪黄狢語(yǔ)言獲取Shell返回結(jié)果的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-07-07
  • C++ auto類型說明符

    C++ auto類型說明符

    在C++11中引入了auto類型說明符,用它就能讓編譯器替我們?nèi)シ治霰磉_(dá)式所屬的類型。當(dāng)然,auto變量必須有初始值,這樣編譯器才能推斷其類型
    2016-03-03
  • C語(yǔ)言中的5種簡(jiǎn)單排序算法(適合小白)

    C語(yǔ)言中的5種簡(jiǎn)單排序算法(適合小白)

    在編程練習(xí)時(shí)我們經(jīng)常會(huì)遇到一些將一串亂序的數(shù)字排列成有序的數(shù)列(遞增,遞減)的問題,以此起到解決問題的效果,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中的5種簡(jiǎn)單排序算法的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • C/C++解析文件名和目錄路徑的方法

    C/C++解析文件名和目錄路徑的方法

    #include <libgen.h> 是一個(gè) C/C++ 語(yǔ)言的頭文件,主要用于字符串處理,特別是在處理文件路徑時(shí),它提供了一些函數(shù)來幫助你解析文件名和目錄路徑,本文就給大家介紹一下C/C++解析文件名和目錄路徑的方法,需要的朋友可以參考下
    2024-10-10
  • C++簡(jiǎn)明分析講解布爾類型及引用

    C++簡(jiǎn)明分析講解布爾類型及引用

    布爾型(Boolean),是一種類型變量類型,引用(reference)就是C++對(duì)C語(yǔ)言的重要擴(kuò)充。引用就是某一變量(目標(biāo))的一個(gè)別名,對(duì)引用的操作與對(duì)變量直接操作完全一樣
    2022-04-04
  • C語(yǔ)言鏈表案例學(xué)習(xí)之通訊錄的實(shí)現(xiàn)

    C語(yǔ)言鏈表案例學(xué)習(xí)之通訊錄的實(shí)現(xiàn)

    為了將所學(xué)到的鏈表的知識(shí)進(jìn)行鞏固學(xué)習(xí),做到學(xué)以致用,本文將利用鏈表制作一個(gè)簡(jiǎn)單的通訊錄。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-10-10
  • 詳細(xì)解析命令行的getopt_long()函數(shù)

    詳細(xì)解析命令行的getopt_long()函數(shù)

    getopt_long支持長(zhǎng)選項(xiàng)的命令行解析,函數(shù)中的參數(shù)argc和argv通常直接從main()的兩個(gè)參數(shù)傳遞而來
    2013-09-09
  • C語(yǔ)言實(shí)現(xiàn)飛機(jī)大戰(zhàn)

    C語(yǔ)言實(shí)現(xiàn)飛機(jī)大戰(zhàn)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)飛機(jī)大戰(zhàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06

最新評(píng)論

黔南| 贵南县| 唐河县| 咸宁市| 汾阳市| 宁明县| 交城县| 临泽县| 江源县| 鄂温| 德昌县| 吉木乃县| 磐石市| 千阳县| 大方县| 石棉县| 洪洞县| 航空| 玛曲县| 灵台县| 新干县| 白河县| 永安市| 花莲市| 万源市| 定兴县| 霍山县| 天镇县| 万州区| 于田县| 永胜县| 甘肃省| 镇原县| 同心县| 武清区| 寻乌县| 辉县市| 台北县| 南开区| 贺兰县| 苗栗市|