色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

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

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

上節我們分析了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;}

那么今天的分享就到這里了,希望對大家有幫助~喜歡的話可以支持一下喲!

寫在最后:對于準備學習C/C++編程的小伙伴,如果你想更好的提升你的編程核心能力(內功)不妨從現在開始!

編輯:jq

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

    關注

    1

    文章

    533

    瀏覽量

    58293
  • 函數
    +關注

    關注

    3

    文章

    4338

    瀏覽量

    62739
  • C++
    C++
    +關注

    關注

    22

    文章

    2111

    瀏覽量

    73704
  • 編譯器
    +關注

    關注

    1

    文章

    1636

    瀏覽量

    49172
收藏 人收藏

    評論

    相關推薦

    AKI跨語言調用庫神助攻C/C++代碼遷移至HarmonyOS NEXT

    /C++代碼快速遷移至HarmonyOS NEXT。憑借卓越的兼容性,AKI已成為廠商與開發者打造鴻蒙原生應用過程中廣泛使用的跨語言調用解決方案。 AKI是一款專為鴻蒙原生開發設計的FFI(外部函數接口
    發表于 01-02 17:08

    運動控制卡周期上報實時數據IO狀態C++

    使用C++進行運動控制卡的周期上報功能實現
    的頭像 發表于 12-17 13:59 ?263次閱讀
    運動控制卡周期上報實時數據IO狀態<b class='flag-5'>之</b><b class='flag-5'>C++</b>篇

    同樣是函數,在CC++中有什么區別

    同樣是函數,在 CC++ 中有什么區別? 第一個返回值。 C語言的函數可以不寫返回值類型,編譯器會默認為返回 int。 但是
    的頭像 發表于 11-29 10:25 ?366次閱讀

    C++新手容易犯的十個編程錯誤

    簡單的總結一下?C++ 新手容易犯的一些編程錯誤,給新人們提供一個參考。 1 有些關鍵字在 cpp 文件中多寫了 對于 C++ 類,一些關鍵字只要寫在 .h 中就好,cpp 中就不用再加上了,比如
    的頭像 發表于 11-15 12:42 ?408次閱讀

    C7000優化C/C++編譯器

    電子發燒友網站提供《C7000優化C/C++編譯器.pdf》資料免費下載
    發表于 10-30 09:45 ?0次下載
    <b class='flag-5'>C</b>7000優化<b class='flag-5'>C</b>/<b class='flag-5'>C++</b>編譯器

    C++語言基礎知識

    電子發燒友網站提供《C++語言基礎知識.pdf》資料免費下載
    發表于 07-19 10:58 ?7次下載

    C++中實現類似instanceof的方法

    函數,可實際上C++中沒有。但是別著急,其實C++中有兩種簡單的方法可以實現類似Java中的instanceof的功能。 在 C++ 中,確定對象的類型是編程中實際需求,使開發人員
    的頭像 發表于 07-18 10:16 ?612次閱讀
    <b class='flag-5'>C++</b>中實現類似instanceof的方法

    inline關鍵字被優化導致此類函數被布局在flash內,怎么處理?

    == 0));} 由于uart.c多處調用這個函數,所以編譯器自作聰明地把它編譯成了非內聯函數(意圖是減少代碼占用?),且elf能找到uart_ll_is_tx_idle標號
    發表于 06-21 12:03

    IDF4.2.1的編譯器優化bug導致panic怎么處理?

    == 0) && (status.st_utx_out == 0));} 它是一個inline函數。我們都認為inline關鍵字,會告訴編譯器內聯
    發表于 06-21 10:55

    FX2 CY7C68013A如何在C++環境中使用LoadEEPROM函數

    我使用的是 FX2 CY7C68013A 芯片。 我知道 CyUSB.NET 庫中有我需要的 LoadEEPROM 函數。 請問如何在 C++ 環境而不是 C#/CLR 環境中使用該
    發表于 05-31 06:59

    使用 MISRA C++:2023? 避免基于范圍的 for 循環中的錯誤

    在前兩篇博客中,我們?向您介紹了新的 MISRA C++ 標準?和?C++ 的歷史?。在這篇博客中,我們將仔細研究以 C++ 中?for?循環為中心的特定規則。
    的頭像 發表于 03-28 13:53 ?821次閱讀
    使用 MISRA <b class='flag-5'>C++</b>:2023? 避免基于范圍的 for 循環中的錯誤

    內聯函數定義 為什么需要內聯函數

    inline關鍵字是C99標準的型關鍵字,其作用是將函數展開,把函數的代碼復制到每一個調用處。
    的頭像 發表于 02-19 12:20 ?558次閱讀

    c語言,c++,java,python區別

    操作系統、嵌入式系統等對性能要求較高的場景。C語言的語法相對簡單,學習曲線較平緩,也是學習其他高級語言的入門語言。 C++C++是在C
    的頭像 發表于 02-05 14:11 ?2456次閱讀

    vb語言和c++語言的區別

    Microsoft開發的一種面向對象的事件驅動編程語言。它的設計目標是簡化編程過程,讓初學者也能快速上手。與相比,C++語言是一種通用的、面向對象的編程語言,其設計目標是提供高性能的系統級編程。 語法: VB語言的
    的頭像 發表于 02-01 10:20 ?2386次閱讀

    C++簡史:C++是如何開始的

    MISRA C++:2023,MISRA? C++ 標準的下一個版本,來了!為了幫助您做好準備,我們介紹了 Perforce 首席技術支持工程師 Frank van den Beuken 博士撰寫
    的頭像 發表于 01-11 09:00 ?622次閱讀
    <b class='flag-5'>C++</b>簡史:<b class='flag-5'>C++</b>是如何開始的
    主站蜘蛛池模板: 泰国淫乐园实录| 最近的2019中文字幕国语版| bbw极度另类孕妇| 欧美特级特黄AAAAA片| 超碰97av 在线人人操| 视频一区国产在线二区| 好男人免费观看在线高清WWW | 欧美人与禽zoz0性伦交app| 插我一区二区在线观看| 亚洲国产在线午夜视频无| 伦理在线影院伦理电影| 国产91青青成人a在线| 一个人日本的视频免费完整版 | 国产在线精品一区二区网站免费| 伊人国产在线视频| 青青草在现线免费观看| 韩剧19禁啪啪无遮挡大尺度| 99国产亚洲精品无码成人| 午夜精品久久久久久久99蜜桃 | 伊人久久电影院| 日韩视频中文字幕精品偷拍| 好大好爽好深舒服死了| 99热成人精品国产免男男| 性一交一乱一色一视频| 嫩草影院在线观看精品| 美女伸开两腿让我爽| 永久精品视频无码一区| 亚洲三级在线视频| 九九在线免费视频| 91嫩草视频在线观看| 青青青青久久久久国产的| 一本色道久久88综合日韩精品 | 被老师按在办公桌吸奶头| 亚洲精品午夜VA久久成人| 青青草原影视| 久久精品视在线-2| 国产精品一区二区四区 | 999久久久国产| 亚洲三级在线视频| 手机看片国产日韩欧美| 男人插曲女人的视频|