衡阳派盒市场营销有限公司

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

    瀏覽量

    58457
  • 函數
    +關注

    關注

    3

    文章

    4346

    瀏覽量

    62968
  • C++
    C++
    +關注

    關注

    22

    文章

    2114

    瀏覽量

    73854
  • 編譯器
    +關注

    關注

    1

    文章

    1642

    瀏覽量

    49284
收藏 人收藏

    評論

    相關推薦

    Spire.XLS for C++組件說明

    Spire.XLS for C++ 是一款專業的 C++ Excel 組件,可以用在各種 C++ 框架和應用程序中。Spire.XLS for C++ 提供了一個對象模型 Excel
    的頭像 發表于 01-14 09:40 ?145次閱讀
    Spire.XLS for <b class='flag-5'>C++</b>組件說明

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

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

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

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

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

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

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

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

    C語言和C++中結構體的區別

    同樣是結構體,看看在C語言和C++中有什么區別?
    的頭像 發表于 10-30 15:11 ?354次閱讀

    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 ?673次閱讀
    <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

    鴻蒙OS開發實例:【Native C++

    使用DevEco Studio創建一個Native C++應用。應用采用Native C++模板,實現使用NAPI調用C標準庫的功能。使用C標準庫hypot接口計算兩個給定數平方和的平
    的頭像 發表于 04-14 11:43 ?2764次閱讀
    鴻蒙OS開發實例:【Native <b class='flag-5'>C++</b>】

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

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

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

    inline關鍵字是C99標準的型關鍵字,其作用是將函數展開,把函數的代碼復制到每一個調用處。
    的頭像 發表于 02-19 12:20 ?593次閱讀
    百家乐tt娱乐| 网页百家乐官网游戏下载| 皇冠网百家乐官网赢钱| 太阳城百家乐官网试玩优惠| 百家乐官网博彩平台| 百家乐官网打闲赢机会多| 新锦江百家乐官网的玩法技巧和规则 | 百家乐有赢钱公式吗| 百家乐官网站| 大发888注册账号| 大发888网页版免费| 盛世国际娱乐场| 百家乐官网真人秀| 请问下百家乐官网去哪个娱乐城玩最好呢 | 百家乐筹码托盘| 博客国际娱乐| 百家乐官网翻天youtube| 长城百家乐游戏| 百家乐娱乐网网| 拉斯维加斯娱乐| 金海岸百家乐官网娱乐城| 百家乐终端下载| 大发888体育| 丰城市| 金都百家乐官网的玩法技巧和规则 | 百家乐官网对子赔率| 网上百家乐官网娱乐场开户注册| 百家乐娱乐城优惠| 大发888网页版出纳| 百家乐官网庄闲作千| 百家乐官网筹码| 微信百家乐群二维码| 老江死了| 百家乐官网群详解包杀| 百家乐闲9点| 星际博彩| 利澳百家乐官网的玩法技巧和规则| 伯爵百家乐的玩法技巧和规则| 长丰县| 澳门百家乐娱乐城注册| 万豪娱乐|