国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

    文章

    542

    瀏覽量

    61741
  • 函數
    +關注

    關注

    3

    文章

    4417

    瀏覽量

    67499
  • C++
    C++
    +關注

    關注

    22

    文章

    2123

    瀏覽量

    77110
  • 編譯器
    +關注

    關注

    1

    文章

    1672

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    keil實現cc++混合編程

    參考touchgfx生成的代碼,發現了一個不需要添加--cpp11 參數的解決方法,具體操作如下。 一、創建一個空白的C文件和頭文件在頭文件中定義c++文件中需要調用的函數,如圖所示 二、在
    發表于 01-26 08:58

    C語言與C++的區別及聯系

    創建源文件時什么都不給,默認是.cpp。 3、返回值 C語言中,如果一個函數沒有指定返回值類型,默認返回int類型;C++中,如果一個函數沒有返回值則必須指定為void。 4、參
    發表于 12-24 07:23

    內聯函數介紹

    內聯函數禁用所有的編譯選項。使用__inline修飾函數導致函數在調用處直接替換為函數體。這樣代
    發表于 12-12 07:08

    CC++之間的聯系

    1、語法兼容性: C++完全兼容C語言的語法,這意味著任何有效的C語言程序都可以直接在C++
    發表于 12-11 06:51

    C語言和C++之間的區別是什么

    區別 1、面向對象編程 (OOP): C語言是一種面向過程的語言,它強調的是通過函數將任務分解為一系列步驟進行執行。 C++C語言的基礎上擴展了面向對象的特性,支持類(class)
    發表于 12-11 06:23

    C++程序異常的處理機制

    運行代碼進行分離,使得程序更加模塊化;另一方面,C++的異常處理可以不需要異常處理在異常發生時的同一個函數,而是可以在更上層合適的位置進行處理。 下面,我們一起來看看C++的異常處理。 2、異常處理
    發表于 12-02 07:12

    inline ASM(內聯匯編)的細節分享

    內聯匯編,否則,仍然是帶有C++表達式的內聯江編,此時\"instructionlist\"中的寄存器的寫法需要遵守相關的規定: 寄存器前必須使用兩個百分號(%%),而不是像
    發表于 10-31 09:11

    簡單的內聯匯編介紹

    前言1、在程序中我們可以嵌入匯編直接對我們加入的硬件進行相應的操作 2、在RISC-V架構中定義的CSR寄存器需要使用特殊的 CSR 指令進行訪問,如果在 C/C++程序中需要使用 CSR 寄存器
    發表于 10-30 08:04

    RISC-V的工具鏈GCC內聯匯編

    具體實現方法和步驟 在RISC-V架構中定義的CSR寄存器需要使用特殊的CSR指令進行訪問,如果CC++程序中需要訪問CSR寄存器,只能使用內嵌匯編指令的方法。在C、C++程序中嵌入
    發表于 10-30 06:59

    GCC內聯匯編

    需要用到C/C++中的內聯匯編語法asm volatile(“instructions”) 以在C代碼中嵌入匯編以執行自定義指令集。 __S
    發表于 10-24 07:46

    通過內聯匯編調用乘法指令mulh\\mulhsu\\mulhu

    mulh、mulhu與mulhsu指令,不能直接驗證,需要其他方法。因此,我們想到了在C語言中嵌入內聯匯編,分別生成三條指令的接口函數,之后便只需在C語言中調用者三中
    發表于 10-24 06:52

    強實時運動控制內核MotionRT750(六):us級高速交互C++,為智能裝備提速

    Windows下運動控制實時內核MotionRT750的高速交互C++
    的頭像 發表于 09-04 14:50 ?722次閱讀
    強實時運動控制內核MotionRT750(六):us級高速交互<b class='flag-5'>之</b><b class='flag-5'>C++</b>,為智能裝備提速

    將TLE9140 DeviceDriver移植到TLE9893時出現未知類型名稱“INLINE”,如何解決?

    ): 警告:在包含的文件中... ./RTE/Device/TLE9893_2QKW62Scmsis_misra.h(78): 錯誤:未知類型名稱“INLINE” 78 | 內聯 sint32 CMSIS_Irq_Dis(void); 我使用的環境是: 如何修復這個錯誤
    發表于 07-28 07:31

    C語言中的內聯函數與宏

    C編程中,內聯函數和宏都用于避免函數調用的開銷并編寫可復用的邏輯部分,但它們在工作方式和安全性方面存在顯著差異。
    的頭像 發表于 07-25 15:10 ?1905次閱讀
    <b class='flag-5'>C</b>語言中的<b class='flag-5'>內聯</b><b class='flag-5'>函數</b>與宏

    MSP430常用內聯函數說明

    電子發燒友網站提供《MSP430常用內聯函數說明.docx》資料免費下載
    發表于 06-05 17:20 ?0次下載