精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

C++語法中的inline內聯函數詳解

C語言編程學習基地 ? 來源:C語言編程學習基地 ? 作者:C語言編程 ? 2021-09-09 09:33 ? 次閱讀

上節我們分析了C++基礎語法的const,static以及 this 指針,那么這節內容我們來看一下 inline 內聯函數吧!

inline 內聯函數

特征

相當于把內聯函數里面的內容寫在調用內聯函數處;

相當于不用執行進入函數的步驟,直接執行函數體;

相當于宏,卻比宏多了類型檢查,真正具有函數特性;

編譯器一般不內聯包含循環、遞歸、switch 等復雜操作的內聯函數;

在類聲明中定義的函數,除了虛函數的其他函數都會自動隱式地當成內聯函數。

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,。..) {/****/};

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

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

編譯器對 inline 函數的處理步驟

將 inline 函數體復制到 inline 函數調用點處;

為所用 inline 函數中的局部變量分配內存空間;

將 inline 函數的的輸入參數和返回值映射到調用方法的局部變量空間中;

如果 inline 函數有多個返回點,將其轉變為 inline 函數代碼塊末尾的分支(使用 GOTO)。

優缺點

優點

內聯函數同宏函數一樣將在被調用處進行代碼展開,省去了參數壓棧、棧幀開辟與回收,結果返回等,從而提高程序運行速度。

內聯函數相比宏函數來說,在代碼展開時,會做安全檢查或自動類型轉換(同普通函數),而宏定義則不會。

在類中聲明同時定義的成員函數,自動轉化為內聯函數,因此內聯函數可以訪問類的成員變量,宏定義則不能。

內聯函數在運行時可調試,而宏定義不可以。

缺點

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

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

是否內聯,程序員不可控。內聯函數只是對編譯器的建議,是否對函數內聯,決定權在于編譯器。

虛函數(virtual)可以是內聯函數(inline)嗎?

虛函數可以是內聯函數,內聯是可以修飾虛函數的,但是當虛函數表現多態性的時候不能內聯。

內聯是在編譯器建議編譯器內聯,而虛函數的多態性在運行期,編譯器無法知道運行期調用哪個代碼,因此虛函數表現為多態性時(運行期)不可以內聯。

inline virtual 唯一可以內聯的時候是:編譯器知道所調用的對象是哪個類(如 Base::who()),這只有在編譯器具有實際對象而不是對象的指針或引用時才會發生。

虛函數內聯使用

#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時隱式內聯{ cout 《《 “I am Derived

”; }};

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

// 此處的虛函數是通過指針調用的,呈現多態性,需要在運行時期間才能確定,所以不能為內聯。 Base *ptr = new Derived(); ptr-》who();

// 因為Base有虛析構函數(virtual ~Base() {}),所以 delete 時,會先調用派生類(Derived)析構函數,再調用基類(Base)析構函數,防止內存泄漏。 delete ptr; ptr = nullptr;

system(“pause”); return 0;}

責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 函數
    +關注

    關注

    3

    文章

    4306

    瀏覽量

    62431
  • C++
    C++
    +關注

    關注

    22

    文章

    2104

    瀏覽量

    73496

原文標題:C++基礎語法梳理:inline 內聯函數!

文章出處:【微信號:cyuyanxuexi,微信公眾號:C語言編程學習基地】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    RealView MDK中使用內聯函數時需要注意的問題

    的文件申明為extern類型。原因是MDK中使用的__inline函數時和標準C++inline
    發表于 08-02 10:10

    C++標準編程:虛函數內聯

      曾經在討論C++的時候,經常會問到:“虛函數能被聲明為內聯嗎?”現在,我們幾乎聽不到這個問題了。現在聽到的是:“你不應該使print成為內聯的。聲明一個虛
    發表于 05-03 11:53

    內聯函數簡介

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

    IAR開發環境默認是不支持inline的嗎?

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

    C++如何處理內聯函數

    當一個函數內聯和虛函數時,會發生代碼替換或使用虛表調用嗎? 為了弄 清楚內聯和虛函數,讓我們將它們分開來考慮。通常,一個
    發表于 11-29 11:59 ?28次下載

    內聯函數詳解

    在類的實現部分。 內聯函數在調用時不是像一般的函數那樣要轉去執行被調用函數函數體,執行完成后再轉回調用
    發表于 11-02 14:05 ?0次下載

    內聯函數和外聯函數有什么區別

    內聯函數是指用inline關鍵字修飾的函數。在類內定義的函數被默認成內聯
    發表于 12-15 11:52 ?5825次閱讀
    <b class='flag-5'>內聯</b><b class='flag-5'>函數</b>和外聯<b class='flag-5'>函數</b>有什么區別

    C++語法的外圍基礎

    程序對內存空間的動態分配的頻繁程度要求簡化語言的相關語法的格式。C++語法規定new算符等效于C語言中mal1oc一類的函數功能;free算
    發表于 03-15 16:55 ?10次下載

    C++基礎語法inline 內聯函數

    上節我們分析了C++基礎語法的const,static以及 this 指針,那么這節內容我們來看一下 inline 內聯函數吧!
    的頭像 發表于 09-09 09:38 ?2121次閱讀

    深度解析C++的虛函數

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

    講解下C語言的內聯函數

    內聯函數C語言從C++借鑒過來的,適當的使用內聯函數
    的頭像 發表于 02-16 09:15 ?1470次閱讀

    C語言內聯函數,提升C技巧必備

    內聯函數C語言從C++借鑒過來的,適當的使用內聯函數
    的頭像 發表于 02-16 09:16 ?757次閱讀

    C語言內聯函數

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

    C++基礎知識之函數2

    C++,我們可以使用inline關鍵字來定義內聯函數內聯
    的頭像 發表于 04-03 10:34 ?511次閱讀

    宏的缺陷與內聯函數的引入

    。 所以為了解決這種不利于調試的問題,就有了內聯函數。 那么什么是內聯函數呢? 我們以inline修飾的
    的頭像 發表于 11-01 17:57 ?422次閱讀