一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C++語法中的inline內(nèi)聯(lián)函數(shù)詳解

C語言編程學(xué)習(xí)基地 ? 來源:C語言編程學(xué)習(xí)基地 ? 作者:C語言編程 ? 2021-09-09 09:33 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

上節(jié)我們分析了C++基礎(chǔ)語法的const,static以及 this 指針,那么這節(jié)內(nèi)容我們來看一下 inline 內(nèi)聯(lián)函數(shù)吧!

inline 內(nèi)聯(lián)函數(shù)

特征

相當(dāng)于把內(nèi)聯(lián)函數(shù)里面的內(nèi)容寫在調(diào)用內(nèi)聯(lián)函數(shù)處;

相當(dāng)于不用執(zhí)行進(jìn)入函數(shù)的步驟,直接執(zhí)行函數(shù)體;

相當(dāng)于宏,卻比宏多了類型檢查,真正具有函數(shù)特性;

編譯器一般不內(nèi)聯(lián)包含循環(huán)、遞歸、switch 等復(fù)雜操作的內(nèi)聯(lián)函數(shù);

在類聲明中定義的函數(shù),除了虛函數(shù)的其他函數(shù)都會自動(dòng)隱式地當(dāng)成內(nèi)聯(lián)函數(shù)。

inline 使用

// 聲明1(加 inline,建議使用)inline int functionName(int first, int second,。..);

// 聲明2(不加 inline)int functionName(int first, int second,。..);

// 定義inline int functionName(int first, int second,。..) {/****/};

// 類內(nèi)定義,隱式內(nèi)聯(lián)class A { int doA() { return 0; } // 隱式內(nèi)聯(lián)}

// 類外定義,需要顯式內(nèi)聯(lián)class A { int doA();}inline int A::doA() { return 0; } // 需要顯式內(nèi)聯(lián)

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

將 inline 函數(shù)體復(fù)制到 inline 函數(shù)調(diào)用點(diǎn)處;

為所用 inline 函數(shù)中的局部變量分配內(nèi)存空間;

將 inline 函數(shù)的的輸入?yún)?shù)和返回值映射到調(diào)用方法的局部變量空間中;

如果 inline 函數(shù)有多個(gè)返回點(diǎn),將其轉(zhuǎn)變?yōu)?inline 函數(shù)代碼塊末尾的分支(使用 GOTO)。

優(yōu)缺點(diǎn)

優(yōu)點(diǎn)

內(nèi)聯(lián)函數(shù)同宏函數(shù)一樣將在被調(diào)用處進(jìn)行代碼展開,省去了參數(shù)壓棧、棧幀開辟與回收,結(jié)果返回等,從而提高程序運(yùn)行速度。

內(nèi)聯(lián)函數(shù)相比宏函數(shù)來說,在代碼展開時(shí),會做安全檢查或自動(dòng)類型轉(zhuǎn)換(同普通函數(shù)),而宏定義則不會。

在類中聲明同時(shí)定義的成員函數(shù),自動(dòng)轉(zhuǎn)化為內(nèi)聯(lián)函數(shù),因此內(nèi)聯(lián)函數(shù)可以訪問類的成員變量,宏定義則不能。

內(nèi)聯(lián)函數(shù)在運(yùn)行時(shí)可調(diào)試,而宏定義不可以。

缺點(diǎn)

代碼膨脹。內(nèi)聯(lián)是以代碼膨脹(復(fù)制)為代價(jià),消除函數(shù)調(diào)用帶來的開銷。如果執(zhí)行函數(shù)體內(nèi)代碼的時(shí)間,相比于函數(shù)調(diào)用的開銷較大,那么效率的收獲會很少。另一方面,每一處內(nèi)聯(lián)函數(shù)的調(diào)用都要復(fù)制代碼,將使程序的總代碼量增大,消耗更多的內(nèi)存空間。

inline 函數(shù)無法隨著函數(shù)庫升級而升級。inline函數(shù)的改變需要重新編譯,不像 non-inline 可以直接鏈接。

是否內(nèi)聯(lián),程序員不可控。內(nèi)聯(lián)函數(shù)只是對編譯器的建議,是否對函數(shù)內(nèi)聯(lián),決定權(quán)在于編譯器。

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

虛函數(shù)可以是內(nèi)聯(lián)函數(shù),內(nèi)聯(lián)是可以修飾虛函數(shù)的,但是當(dāng)虛函數(shù)表現(xiàn)多態(tài)性的時(shí)候不能內(nèi)聯(lián)。

內(nèi)聯(lián)是在編譯器建議編譯器內(nèi)聯(lián),而虛函數(shù)的多態(tài)性在運(yùn)行期,編譯器無法知道運(yùn)行期調(diào)用哪個(gè)代碼,因此虛函數(shù)表現(xiàn)為多態(tài)性時(shí)(運(yùn)行期)不可以內(nèi)聯(lián)。

inline virtual 唯一可以內(nèi)聯(lián)的時(shí)候是:編譯器知道所調(diào)用的對象是哪個(gè)類(如 Base::who()),這只有在編譯器具有實(shí)際對象而不是對象的指針或引用時(shí)才會發(fā)生。

虛函數(shù)內(nèi)聯(lián)使用

#include 《iostream》 using namespace std;class Base{public: inline virtual void who(){ cout 《《 “I am Base

”; } virtual ~Base() {}};class Derived : public Base{public: inline void who() // 不寫inline時(shí)隱式內(nèi)聯(lián){ cout 《《 “I am Derived

”; }};

int main(){ // 此處的虛函數(shù) who(),是通過類(Base)的具體對象(b)來調(diào)用的,編譯期間就能確定了,所以它可以是內(nèi)聯(lián)的,但最終是否內(nèi)聯(lián)取決于編譯器。 Base b; b.who();

// 此處的虛函數(shù)是通過指針調(diào)用的,呈現(xiàn)多態(tài)性,需要在運(yùn)行時(shí)期間才能確定,所以不能為內(nèi)聯(lián)。 Base *ptr = new Derived(); ptr-》who();

// 因?yàn)锽ase有虛析構(gòu)函數(shù)(virtual ~Base() {}),所以 delete 時(shí),會先調(diào)用派生類(Derived)析構(gòu)函數(shù),再調(diào)用基類(Base)析構(gòu)函數(shù),防止內(nèi)存泄漏。 delete ptr; ptr = nullptr;

system(“pause”); return 0;}

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4381

    瀏覽量

    64921
  • C++
    C++
    +關(guān)注

    關(guān)注

    22

    文章

    2119

    瀏覽量

    75341

原文標(biāo)題:C++基礎(chǔ)語法梳理:inline 內(nèi)聯(lián)函數(shù)!

文章出處:【微信號:cyuyanxuexi,微信公眾號:C語言編程學(xué)習(xí)基地】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    RealView MDK中使用內(nèi)聯(lián)函數(shù)時(shí)需要注意的問題

    的文件申明為extern類型。原因是MDK中使用的__inline函數(shù)時(shí)和標(biāo)準(zhǔn)C++inline
    發(fā)表于 08-02 10:10

    C++標(biāo)準(zhǔn)編程:虛函數(shù)內(nèi)聯(lián)

      曾經(jīng)在討論C++的時(shí)候,經(jīng)常會問到:“虛函數(shù)能被聲明為內(nèi)聯(lián)嗎?”現(xiàn)在,我們幾乎聽不到這個(gè)問題了?,F(xiàn)在聽到的是:“你不應(yīng)該使print成為內(nèi)聯(lián)的。聲明一個(gè)虛
    發(fā)表于 05-03 11:53

    內(nèi)聯(lián)函數(shù)簡介

    1.內(nèi)聯(lián)函數(shù)C++我們通常定義以下函數(shù)來求兩個(gè)整數(shù)的最大值:復(fù)制代碼 代碼如下:int max(int a, int b){return
    發(fā)表于 09-11 16:22

    IAR開發(fā)環(huán)境默認(rèn)是不支持inline的嗎?

    help文件里的解釋是說:C++ inline semantics, enables C++ inline semantics when compiling a Standard
    發(fā)表于 09-05 04:35

    C++如何處理內(nèi)聯(lián)函數(shù)

    當(dāng)一個(gè)函數(shù)內(nèi)聯(lián)和虛函數(shù)時(shí),會發(fā)生代碼替換或使用虛表調(diào)用嗎? 為了弄 清楚內(nèi)聯(lián)和虛函數(shù),讓我們將它們分開來考慮。通常,一個(gè)
    發(fā)表于 11-29 11:59 ?28次下載

    內(nèi)聯(lián)函數(shù)詳解

    在類的實(shí)現(xiàn)部分。 內(nèi)聯(lián)函數(shù)在調(diào)用時(shí)不是像一般的函數(shù)那樣要轉(zhuǎn)去執(zhí)行被調(diào)用函數(shù)函數(shù)體,執(zhí)行完成后再轉(zhuǎn)回調(diào)用
    發(fā)表于 11-02 14:05 ?0次下載

    內(nèi)聯(lián)函數(shù)和外聯(lián)函數(shù)有什么區(qū)別

    內(nèi)聯(lián)函數(shù)是指用inline關(guān)鍵字修飾的函數(shù)。在類內(nèi)定義的函數(shù)被默認(rèn)成內(nèi)聯(lián)
    發(fā)表于 12-15 11:52 ?6256次閱讀
    <b class='flag-5'>內(nèi)聯(lián)</b><b class='flag-5'>函數(shù)</b>和外聯(lián)<b class='flag-5'>函數(shù)</b>有什么區(qū)別

    C++語法的外圍基礎(chǔ)

    程序?qū)?nèi)存空間的動(dòng)態(tài)分配的頻繁程度要求簡化語言的相關(guān)語法的格式。C++語法規(guī)定new算符等效于C語言中mal1oc一類的函數(shù)功能;free算
    發(fā)表于 03-15 16:55 ?10次下載

    C++基礎(chǔ)語法inline 內(nèi)聯(lián)函數(shù)

    上節(jié)我們分析了C++基礎(chǔ)語法的const,static以及 this 指針,那么這節(jié)內(nèi)容我們來看一下 inline 內(nèi)聯(lián)函數(shù)吧!
    的頭像 發(fā)表于 09-09 09:38 ?2394次閱讀

    深度解析C++的虛函數(shù)

    函數(shù)作為C++的重要特性,讓人又愛又怕,愛它功能強(qiáng)大,但又怕駕馭不好,讓它反咬一口,今天我們用CPU的角度,撕掉語法的偽裝,重新認(rèn)識一下虛函數(shù)。 虛
    的頭像 發(fā)表于 02-15 11:14 ?1141次閱讀
    深度解析<b class='flag-5'>C++</b><b class='flag-5'>中</b>的虛<b class='flag-5'>函數(shù)</b>

    講解下C語言的內(nèi)聯(lián)函數(shù)

    內(nèi)聯(lián)函數(shù)C語言從C++借鑒過來的,適當(dāng)?shù)氖褂?b class='flag-5'>內(nèi)聯(lián)函數(shù)
    的頭像 發(fā)表于 02-16 09:15 ?1814次閱讀

    C語言內(nèi)聯(lián)函數(shù),提升C技巧必備

    內(nèi)聯(lián)函數(shù)C語言從C++借鑒過來的,適當(dāng)?shù)氖褂?b class='flag-5'>內(nèi)聯(lián)函數(shù)
    的頭像 發(fā)表于 02-16 09:16 ?1026次閱讀

    C語言內(nèi)聯(lián)函數(shù)

    函數(shù)B很小,又被頻繁的調(diào)用,可能函數(shù)調(diào)用的切換時(shí)間比函數(shù)內(nèi)代碼的執(zhí)行時(shí)間還長,這樣明顯劃不來,那么我們就可以將這個(gè)函數(shù)聲明為內(nèi)聯(lián)(加上
    的頭像 發(fā)表于 02-21 16:55 ?1313次閱讀
    <b class='flag-5'>C</b>語言<b class='flag-5'>內(nèi)聯(lián)</b><b class='flag-5'>函數(shù)</b>

    C++基礎(chǔ)知識之函數(shù)2

    C++,我們可以使用inline關(guān)鍵字來定義內(nèi)聯(lián)函數(shù)。內(nèi)聯(lián)
    的頭像 發(fā)表于 04-03 10:34 ?779次閱讀

    宏的缺陷與內(nèi)聯(lián)函數(shù)的引入

    。 所以為了解決這種不利于調(diào)試的問題,就有了內(nèi)聯(lián)函數(shù)。 那么什么是內(nèi)聯(lián)函數(shù)呢? 我們以inline修飾的
    的頭像 發(fā)表于 11-01 17:57 ?667次閱讀