最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++淺析內(nèi)聯(lián)函數(shù)的使用

 更新時間:2022年05月16日 15:14:37   作者:Hiland.  
為了消除函數(shù)調(diào)用的時空開銷,C++ 提供一種提高效率的方法,即在編譯時將函數(shù)調(diào)用處用函數(shù)體替換,類似于C語言中的宏展開。這種在函數(shù)調(diào)用處直接嵌入函數(shù)體的函數(shù)稱為內(nèi)聯(lián)函數(shù)(Inline Function),又稱內(nèi)嵌函數(shù)或者內(nèi)置函數(shù)

一. 概念

以inline修飾的函數(shù)叫做內(nèi)聯(lián)函數(shù),編譯時C++編譯器會在調(diào)用內(nèi)聯(lián)函數(shù)的地方展開,沒有函數(shù)壓棧的開銷, 內(nèi)聯(lián)函數(shù)提升程序運行的效率。

在C++里為了提高效率使用內(nèi)聯(lián)函數(shù),可是我們會發(fā)現(xiàn)在C語言里面已經(jīng)有了宏,也可以處理關(guān)于這個效率的問題,那為什么還會出現(xiàn)內(nèi)聯(lián)函數(shù)呢?

當我們要寫一個Add的宏時:

#define Add(x, y) ((x) + (y))

但是也有人可能會寫錯,出現(xiàn)下面這些情況,比如:

#define Add(x, y) return x + y ; 
#define Add(x, y) return (x + y);
#define Add(x, y) return (x + y)
#define Add(x, y) x + y
#define Add(x, y) x + y;
#define Add(x, y) (x + y);
#define Add(x, y) (x + y)

以上這些都是有可能會出現(xiàn)的情況,既然這么容易寫錯,于是乎C++就出現(xiàn)了內(nèi)聯(lián)函數(shù),就是為了解決宏函數(shù)晦澀難懂,容易寫錯的問題

那么如何查看內(nèi)聯(lián)函數(shù)呢?

我們知道宏是不支持調(diào)試的,但是內(nèi)聯(lián)函數(shù)是支持調(diào)試的,那內(nèi)聯(lián)函數(shù)怎么支持調(diào)試的呢?其實內(nèi)聯(lián)函數(shù)在debug版本下是不會展開的,如圖:

但是release版本下又看不到匯編代碼,為了能查看內(nèi)聯(lián)函數(shù),我們需要更改一些設(shè)置提高優(yōu)化等級,在debug模式下,需要對編譯器進行設(shè)置,否則不會展開,因為debug模式下,編譯器默認不會對代碼進行優(yōu)化,以下給出vs2019的設(shè)置方式,如下圖:(這里由于疏忽忘記在函數(shù)前加上inline,記得加上并重新編譯以后在調(diào)試狀態(tài)下轉(zhuǎn)到反匯編查看)

這些配置好了以后再次查看匯編代碼:

我們就會發(fā)現(xiàn)這里不再call函數(shù)了,說明沒有建立函數(shù)棧幀,而是直接展開了,inline起作用了這里

二. 特性

  • inline是一種以空間換時間的做法,省去調(diào)用函數(shù)額開銷(建立棧幀)。所以代碼很長或者有循環(huán)/遞歸的函數(shù)不適宜使用作為內(nèi)聯(lián)函數(shù)。(一般十行左右的代碼使用)
  • inline對于編譯器而言只是一個建議,編譯器會自動優(yōu)化,如果定義為inline的函數(shù)體內(nèi)有循環(huán)/遞歸或者代碼太長等等,編譯器優(yōu)化時會忽略掉內(nèi)聯(lián)。
  • inline不建議聲明和定義分離,分離會導(dǎo)致鏈接錯誤。因為inline被展開,就沒有函數(shù)地址了,鏈接就會找不到。

聲明和定義分離以后會報鏈接錯誤:

回顧:

宏的優(yōu)缺點?

優(yōu)點:

1.增強代碼的復(fù)用性。

2.提高性能。

缺點:

1.不方便調(diào)試宏。(因為預(yù)編譯階段進行了替換)

2.導(dǎo)致代碼可讀性差,可維護性差,容易誤用。

3.沒有類型安全的檢查 。

擴展:

C++有哪些技術(shù)替代宏?

1. 常量定義 換用const

2. 函數(shù)定義 換用內(nèi)聯(lián)函數(shù)

到此這篇關(guān)于C++淺析內(nèi)聯(lián)函數(shù)的使用的文章就介紹到這了,更多相關(guān)C++內(nèi)聯(lián)函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++廣播通信實例

    C++廣播通信實例

    這篇文章主要介紹了C++實現(xiàn)廣播通信的方法,實例講述了C++ socket廣播通信的原理與實現(xiàn)方法,需要的朋友可以參考下
    2014-10-10
  • C++實現(xiàn)單鏈表刪除倒數(shù)第k個節(jié)點的方法

    C++實現(xiàn)單鏈表刪除倒數(shù)第k個節(jié)點的方法

    這篇文章主要介紹了C++實現(xiàn)單鏈表刪除倒數(shù)第k個節(jié)點的方法,結(jié)合實例形式分析了C++單鏈表的定義、遍歷及刪除相關(guān)操作技巧,需要的朋友可以參考下
    2017-05-05
  • Java?C++?leetcode面試零矩陣

    Java?C++?leetcode面試零矩陣

    這篇文章主要為大家介紹了Java?C++題解leetcode面試零矩陣示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • C++ Boost PointerContainer智能指針詳解

    C++ Boost PointerContainer智能指針詳解

    智能指針是一種像指針的C++對象,但它能夠在對象不使用的時候自己銷毀掉。雖然STL提供了auto_ptr,但是由于不能同容器一起使用(不支持拷貝和賦值操作),因此很少有人使用。它是Boost各組件中,應(yīng)用最為廣泛的一個
    2022-11-11
  • C/C++預(yù)處理淺析使用形式

    C/C++預(yù)處理淺析使用形式

    預(yù)處理是指在進行編譯的詞法掃描和語法分析之前所作的工作。預(yù)處理指令指示在程序正式編譯前就由編譯器進行的操作,可放在程序中任何位置。處理完畢自動進入對源程序的編譯。C/C++中的預(yù)處理主要包含三種:文件包含、宏定義、條件編譯
    2022-09-09
  • C++變換迭代器使用方法小結(jié)

    C++變換迭代器使用方法小結(jié)

    本文主要介紹了C++變換迭代器使用方法小結(jié),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-04-04
  • 聊聊C++的mutable和volatile

    聊聊C++的mutable和volatile

    這篇文章主要介紹了C++的mutable和volatile的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下
    2020-09-09
  • 如何使用C語言實現(xiàn)平衡二叉樹數(shù)據(jù)結(jié)構(gòu)算法

    如何使用C語言實現(xiàn)平衡二叉樹數(shù)據(jù)結(jié)構(gòu)算法

    對于判斷是否為平衡二叉樹而言,我們需要知道以下特性:是一個二叉樹也是一個二叉排序樹該樹的每個結(jié)點上的(深度)左子樹 - 右子樹的值為平衡因子(BF(Balance Factor))該樹的每一個節(jié)點的左子樹和右子樹的高度至多等于1(平衡因子只可能是-1,0,1)
    2021-08-08
  • C/C++解析文件名和目錄路徑的方法

    C/C++解析文件名和目錄路徑的方法

    #include <libgen.h> 是一個 C/C++ 語言的頭文件,主要用于字符串處理,特別是在處理文件路徑時,它提供了一些函數(shù)來幫助你解析文件名和目錄路徑,本文就給大家介紹一下C/C++解析文件名和目錄路徑的方法,需要的朋友可以參考下
    2024-10-10
  • C語言sizeof和strlen的指針和數(shù)組面試題詳解

    C語言sizeof和strlen的指針和數(shù)組面試題詳解

    strlen是函數(shù),字符串長度,不包括停止符。而sizeof則是內(nèi)存塊的大小,包括停止符。數(shù)組是一種數(shù)據(jù)類型,數(shù)據(jù)類型的本質(zhì)就是固定大小,內(nèi)存塊的別名??梢杂胹izeof()一般都是數(shù)據(jù)類型
    2022-04-04

最新評論

焦作市| 虎林市| 齐河县| 巫山县| 灵武市| 特克斯县| 同德县| 清水县| 镇安县| 垦利县| 文成县| 新兴县| 成武县| 永嘉县| 临汾市| 柳林县| 张掖市| 九江县| 抚松县| 荣昌县| 抚松县| 蚌埠市| 漳州市| 巴塘县| 乐东| 延川县| 瓦房店市| 罗山县| 泽普县| 西贡区| 故城县| 山阳县| 磴口县| 合阳县| 波密县| 建始县| 克什克腾旗| 五指山市| 岚皋县| 平原县| 邯郸市|