" />

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

深入理解C++內(nèi)聯(lián)函數(shù)

 更新時間:2022年01月11日 16:23:04   作者:Enjoy solitude-  
這篇文章主要為大家介紹了C++內(nèi)聯(lián)函數(shù),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

內(nèi)聯(lián)函數(shù)的概念

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

舉個例子:

在C++中我們通常定義以下函數(shù)來求兩個整數(shù)的最大值:

代碼如下:

int max(int a, int b) 
{ 
 return a > b ? a : b; 
} 

為這么一個小的操作定義一個函數(shù)的好處有:

  • 閱讀和理解函數(shù) max 的調(diào)用,要比讀一條等價的條件表達式并解釋它的含義要容易得多
  • 如果需要做任何修改,修改函數(shù)要比找出并修改每一處等價表達式容易得多
  • 使用函數(shù)可以確保統(tǒng)一的行為,每個測試都保證以相同的方式實現(xiàn)
  • 函數(shù)可以重用,不必為其他應用程序重寫代碼

雖然有這么多好處,但是寫成函數(shù)有一個潛在的缺點:調(diào)用函數(shù)比求解等價表達式要慢得多。在大多數(shù)的機器上,調(diào)用函數(shù)都要做很多工作:

- 程序需要存儲當前地址,以便調(diào)用結束后返回繼續(xù)執(zhí)行
- 程序將傳入函數(shù)的參數(shù)壓棧
- 程序跳到跳到標記函數(shù)起點的內(nèi)存單元,執(zhí)行函數(shù)代碼
- 函數(shù)調(diào)用結束后,將棧清空,返回到之前存儲的地址繼續(xù)執(zhí)行

C++中支持內(nèi)聯(lián)函數(shù),其目的是為了提高函數(shù)的執(zhí)行效率,用關鍵字 inline 放在函數(shù)定義(注意是定義而非聲明)的前面即可將函數(shù)指定為內(nèi)聯(lián)函數(shù),內(nèi)聯(lián)函數(shù)通常就是將它在程序中的每個調(diào)用點上“內(nèi)聯(lián)地”展開,相當于直接copy一份函數(shù)體內(nèi)代碼,在執(zhí)行到的時候直接按照代碼順序執(zhí)行,省去了許多函數(shù)調(diào)用過程,節(jié)省了時間。

假設我們將 max 定義為內(nèi)聯(lián)函數(shù):

代碼如下:

inline int max(int a, int b) 
{ 
 return a > b ? a : b; 
} 
則調(diào)用: cout<<max(a, b)<<endl;


在編譯時展開為: cout<<(a > b ? a : b)<<endl;

從而消除了把 max寫成函數(shù)的額外執(zhí)行開銷

是不是覺得這和有些像?那為什么不直接用宏?還要整個內(nèi)聯(lián)函數(shù)

內(nèi)聯(lián)函數(shù)和宏

首先,宏能夠表達的意思有限,通常是一行的表達式。其次,用宏的安全性不高,容易出錯。

假設定義宏如下:

#define MAX(a,b)  a>b?:a:b

那么語句

res = MAX(i,j)+2;

會被預處理器擴展為

res = i > j? i:j+2;

由于+的優(yōu)先級高于?,因此最終比較結果與我們期望不符。
那如果把宏修改為

#define MAX(a,b) (i &gt; j? i:j)

仍然存在問題,例如

res = MAX(i++,j)
res = (i++ < j? i++:j);  // i被+了兩次

同時,宏無法調(diào)試,但內(nèi)聯(lián)函數(shù)可以。在程序的調(diào)試版本,內(nèi)聯(lián)函數(shù)并沒有真正內(nèi)聯(lián),就像普通函數(shù)一樣實現(xiàn)調(diào)試,在程序的發(fā)行版本,編譯器才會實現(xiàn)真正內(nèi)聯(lián)。

無論是《Effective C++》中的 “Prefer consts,enums,and inlines to #defines” 條款,還是《高質(zhì)量程序設計指南——C++/C語言》中的“用函數(shù)內(nèi)聯(lián)取代宏”,宏在C++中基本是被廢了。

內(nèi)聯(lián)函數(shù)的特性

1、inline是一種以空間換時間的做法,省了去調(diào)用函數(shù)的額外開銷。由于內(nèi)聯(lián)函數(shù)會在調(diào)用的位置展開,所以代碼很長或者有遞歸的函數(shù)不適宜作為內(nèi)聯(lián)函數(shù)。頻繁調(diào)用的小函數(shù)建議定義成內(nèi)聯(lián)函數(shù)。

2、inline對于編譯器而言只是一個建議,編譯器會自動優(yōu)化,如果定義為inline的函數(shù)體內(nèi)有遞歸等,編譯器優(yōu)化時會忽略掉內(nèi)聯(lián)。

3、inline不建議聲明和定義分離,分離會導致鏈接錯誤。因為inline被展開,就沒有函數(shù)地址了鏈接就會找不到。

4、關鍵字 inline 必須與函數(shù)定義體放在一起才能使函數(shù)成為內(nèi)聯(lián),僅將 inline 放在函數(shù)聲明前面不起任何作用。

5 .相比于宏,有類型檢查,安全性更高,具有一般函數(shù)特性,可調(diào)試。

總結

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內(nèi)容!

相關文章

  • 使用C語言實現(xiàn)掃雷小游戲

    使用C語言實現(xiàn)掃雷小游戲

    這篇文章主要為大家詳細介紹了使用C語言實現(xiàn)掃雷小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • Qt編寫顯示密碼強度的控件

    Qt編寫顯示密碼強度的控件

    這篇文章主要為大家詳細介紹了Qt編寫顯示密碼強度的控件,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C++代碼實現(xiàn)貪吃蛇小游戲

    C++代碼實現(xiàn)貪吃蛇小游戲

    這篇文章主要為大家詳細介紹了C++貪吃蛇小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • C/C++中比較字符串的方法詳解

    C/C++中比較字符串的方法詳解

    這篇文章主要介紹了C/C++中比較字符串的方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C++定義和初始化string對象實例詳解

    C++定義和初始化string對象實例詳解

    這篇文章主要為大家介紹了C++定義和初始化string對象實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • C++私有繼承與EBO深入分析講解

    C++私有繼承與EBO深入分析講解

    這篇文章主要介紹了C++私有繼承,在私有繼承當中,基類的公有成員和保護成員都會成為派生類的私有成員。這意味著基類的方法都會被private關鍵字描述,我們可以在派生類中使用它,但類對象無法直接調(diào)用,下面來看看詳細內(nèi)容吧
    2022-08-08
  • 使用remalloc的注意事項說明(必看篇)

    使用remalloc的注意事項說明(必看篇)

    下面小編就為大家?guī)硪黄褂胷emalloc的注意事項說明(必看篇)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • 一文帶你入木三分地理解字符串KMP算法以及C++實現(xiàn)

    一文帶你入木三分地理解字符串KMP算法以及C++實現(xiàn)

    KMP算法是一種改進的字符串匹配算法,KMP算法的核心是利用匹配失敗后的信息,盡量減少模式串與主串的匹配次數(shù)以達到快速匹配的目的。本文就來和大家聊聊KMP算法的原理與實現(xiàn),需要的可以參考一下
    2022-12-12
  • C++基礎入門篇之強制轉換

    C++基礎入門篇之強制轉換

    這篇文章主要給大家介紹了關于C++基礎入門篇之強制轉換的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • C++中的函數(shù)你真的理解了嗎

    C++中的函數(shù)你真的理解了嗎

    這篇文章主要為大家詳細介紹了C++中的函數(shù),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02

最新評論

凤凰县| 永年县| 寿光市| 株洲县| 义马市| 清河县| 兰坪| 巴林左旗| 湾仔区| 彭州市| 韶山市| 东乡族自治县| 海门市| 鹿邑县| 古交市| 怀来县| 清远市| 昌吉市| 张家界市| 陈巴尔虎旗| 小金县| 大埔县| 景德镇市| 剑阁县| 黔江区| 吴川市| 登封市| 沙洋县| 佛教| 十堰市| 东港市| 弥渡县| 丹凤县| 元朗区| 山西省| 定陶县| 旌德县| 浦县| 平遥县| 杭锦旗| 扎兰屯市|