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

C++實(shí)操之內(nèi)聯(lián)成員函數(shù)介紹

 更新時(shí)間:2021年12月21日 15:07:03   作者:夜流冰  
大家好,本篇文章主要講的是C++實(shí)操之內(nèi)聯(lián)成員函數(shù)介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽

前言

在C語(yǔ)言中,我們使用了宏函數(shù),這是編譯器用來(lái)減少執(zhí)行時(shí)間的一種優(yōu)化技術(shù)。那么問(wèn)題來(lái)了,在C++中,有什么更好的方法來(lái)解決這個(gè)問(wèn)題呢?我們引入了內(nèi)聯(lián)函數(shù),這是編譯器用來(lái)減少執(zhí)行時(shí)間的一種優(yōu)化技術(shù)。我們將討論內(nèi)聯(lián)函數(shù)的 “what, why, when & how”。

什么是內(nèi)聯(lián)函數(shù):

內(nèi)聯(lián)函數(shù)是C++的一個(gè)增強(qiáng)功能,可以減少程序的執(zhí)行時(shí)間。函數(shù)可以通過(guò)指示編譯器,使其成為內(nèi)聯(lián)函數(shù),這樣編譯器就可以取代那些被調(diào)用的函數(shù)定義。編譯器會(huì)在編譯時(shí)替換內(nèi)聯(lián)函數(shù)的定義,而不是在運(yùn)行時(shí)引用函數(shù)定義。

注意:這只是建議編譯器將函數(shù)內(nèi)聯(lián),如果函數(shù)很大(在可執(zhí)行指令等方面),編譯器可以忽略 "內(nèi)聯(lián) "請(qǐng)求,將函數(shù)作為普通函數(shù)處理。

如何使一個(gè)函數(shù)成為內(nèi)聯(lián):

要使任何函數(shù)成為內(nèi)聯(lián)函數(shù),在其定義的開(kāi)頭使用關(guān)鍵字 "inline"。

例子:

 
 
第一種情況:
 
class A
 
{
 
public:
 
  inline int add(int a, int b)
 
  {
 
    return (a+b);
 
  }
 
};
 
 
 
第二種情況:
 
class A
 
{
 
public:
 
  int add(int a, int b);
 
};
 
 
 
inline int A::add(int a, int b)
 
{
 
  return (a+b);
 
}
 
 
 
第三種情況:
 
inline int add_two (int a, int b)
 
{
 
  return (a+b);
 
}

你可以在它的類定義中定義一個(gè)成員函數(shù),或者如果你已經(jīng)在類定義中聲明了(但沒(méi)有定義)該成員函數(shù),你可以在外面定義它。

第一種情況:

當(dāng)在類成員列表中定義的成員函數(shù)默認(rèn)為內(nèi)聯(lián)成員函數(shù),所以第一個(gè)class A定義里,也可以省略inline關(guān)鍵字。

一般含有幾行代碼的成員函數(shù)通常被內(nèi)聯(lián)聲明,或者說(shuō)可以在類的定義中定義較短的函數(shù)。

第二種情況:

如果你在類定義之外定義一個(gè)成員函數(shù),它必須出現(xiàn)在包圍類定義的命名空間范圍內(nèi)。你還必須使用范圍解析(::)操作符來(lái)限定成員函數(shù)的名稱。

這時(shí)如果要聲明為內(nèi)聯(lián)函數(shù),可以類中用inline關(guān)鍵字聲明它(并在其類之外定義該函數(shù)),或者在類的聲明之外用inline關(guān)鍵字定義它。

上面第二個(gè)class A是在定義處使用inline關(guān)鍵字。

第三種情況:

普通的全局函數(shù),可以在聲明或定義處添加inline關(guān)鍵字。

在下面的例子中,成員函數(shù)Y::f()是一個(gè)內(nèi)聯(lián)成員函數(shù):

鏈接屬性:

內(nèi)聯(lián)修飾符不影響成員或非成員函數(shù)的鏈接屬性:鏈接默認(rèn)為外部鏈接。

內(nèi)部鏈接表示只在當(dāng)前文件內(nèi)可訪問(wèn),外部鏈接表示多個(gè)文件可訪問(wèn)。

局部類的成員函數(shù)必須在其類定義中定義。因此,局部類的成員函數(shù)是隱含的內(nèi)聯(lián)函數(shù)。這些內(nèi)聯(lián)成員函數(shù)沒(méi)有鏈接屬性。

為什么使用內(nèi)聯(lián):

在許多地方,我們?yōu)樾〉墓ぷ?功能創(chuàng)建函數(shù),其中包含簡(jiǎn)單和較少數(shù)量的可執(zhí)行指令。想象一下它們每次被調(diào)用者調(diào)用時(shí)的開(kāi)銷。

當(dāng)遇到正常的函數(shù)調(diào)用指令時(shí),程序會(huì)存儲(chǔ)緊隨函數(shù)調(diào)用語(yǔ)句之后的指令的內(nèi)存地址,將被調(diào)用的函數(shù)加載到內(nèi)存中,復(fù)制參數(shù)值,跳轉(zhuǎn)到被調(diào)用函數(shù)的內(nèi)存位置,執(zhí)行函數(shù)代碼,存儲(chǔ)函數(shù)的返回值,然后跳回執(zhí)行被調(diào)用函數(shù)前剛剛保存的指令地址。運(yùn)行時(shí)間開(kāi)銷太大。

C++的內(nèi)聯(lián)函數(shù)提供了一個(gè)替代方案。使用inline關(guān)鍵字,編譯器用函數(shù)代碼本身替換函數(shù)調(diào)用語(yǔ)句,然后編譯整個(gè)代碼(此過(guò)程成為代碼展開(kāi))。因此,使用內(nèi)聯(lián)函數(shù),編譯器不必跳到另一個(gè)位置來(lái)執(zhí)行函數(shù),然后再跳回來(lái),因?yàn)楸徽{(diào)用函數(shù)的代碼已經(jīng)提供給調(diào)用程序。

通過(guò)下面的優(yōu)點(diǎn)、缺點(diǎn)和性能分析,你將能夠理解為什么使用“inline”關(guān)鍵字。

優(yōu)點(diǎn) :

1. 它避免了函數(shù)調(diào)用的開(kāi)銷,從而加快了程序執(zhí)行。

2. 當(dāng)函數(shù)調(diào)用發(fā)生時(shí),它節(jié)省了在堆棧上push/pop變量的開(kāi)銷。

3. 它節(jié)省了從一個(gè)函數(shù)中返回調(diào)用處的開(kāi)銷。

4. 它通過(guò)利用指令緩存來(lái)更多使用本地引用。

5. 通過(guò)將其標(biāo)記為內(nèi)聯(lián),你可以將函數(shù)定義放在頭文件中(也就是說(shuō),它可以包含在多個(gè)編譯單元中,而不會(huì)被鏈接器抱怨)。

缺點(diǎn) :

1. 由于代碼展開(kāi),增加了最終可執(zhí)行文件的大小。

2. C++的內(nèi)聯(lián)是在編譯時(shí)處理的。這意味著如果你改變了內(nèi)聯(lián)函數(shù)的代碼,你將需要重新編譯所有使用它的代碼,以確保它被更新。

3.??當(dāng)在頭文件中使用時(shí),它使你的頭文件變得更大,因?yàn)橛脩舨⒉魂P(guān)心這些信息。

4.??如上所述,它增加了可執(zhí)行文件的大小,這可能會(huì)導(dǎo)致內(nèi)存的抖動(dòng)。更多的頁(yè)面故障會(huì)降低你的程序性能。

5. 有時(shí)并不實(shí)用,例如在嵌入式系統(tǒng)中,由于存儲(chǔ)空間的限制,要保證盡可能小的可執(zhí)行文件。

關(guān)鍵點(diǎn) :

1. 內(nèi)聯(lián)函數(shù)只是一個(gè)建議,而不是強(qiáng)制性的。編譯器可能會(huì)也可能不會(huì)內(nèi)聯(lián)你標(biāo)記為內(nèi)聯(lián)的函數(shù)。沒(méi)有標(biāo)記為內(nèi)聯(lián)的函數(shù),在編譯或連接時(shí),也可能被設(shè)置為內(nèi)聯(lián)。

2. 內(nèi)聯(lián)的工作方式就像編譯器控制的復(fù)制/粘貼,這與預(yù)處理器的宏完全不同。宏會(huì)被強(qiáng)行內(nèi)聯(lián),會(huì)污染所有的命名空間和代碼,不容易調(diào)試。

3. 所有在類中聲明并定義的成員函數(shù)默認(rèn)是內(nèi)聯(lián)的。所以不需要明確定義為內(nèi)聯(lián)。

4. 虛函數(shù)不支持內(nèi)聯(lián)。但是,有時(shí)候,當(dāng)編譯器可以確定對(duì)象的類型時(shí)(即對(duì)象是在同一個(gè)函數(shù)體中聲明和構(gòu)造的),即使是一個(gè)虛擬函數(shù)也會(huì)被內(nèi)聯(lián),因?yàn)榫幾g器確切地知道對(duì)象的類型。

5. 模板方法/函數(shù)并不總是被內(nèi)聯(lián)的(它們?cè)陬^文件中的存在不會(huì)使它們自動(dòng)內(nèi)聯(lián))。

6. 大多數(shù)編譯器會(huì)對(duì)遞歸函數(shù)進(jìn)行內(nèi)聯(lián),有些編譯器有此功能的開(kāi)關(guān),并可以設(shè)置最大的遞歸深度。

總結(jié)

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

相關(guān)文章

  • C++深入探究list的模擬實(shí)現(xiàn)

    C++深入探究list的模擬實(shí)現(xiàn)

    list相較于vector來(lái)說(shuō)會(huì)顯得復(fù)雜,它的好處是在任意位置插入,刪除都是一個(gè)O(1)的時(shí)間復(fù)雜度,本文主要介紹了C++中List的模擬實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • win32 api實(shí)現(xiàn)簡(jiǎn)單的消息窗口示例

    win32 api實(shí)現(xiàn)簡(jiǎn)單的消息窗口示例

    這篇文章主要介紹了使用win32 api實(shí)現(xiàn)簡(jiǎn)單的消息窗口示例,需要的朋友可以參考下
    2014-03-03
  • C++設(shè)計(jì)模式之建造者模式

    C++設(shè)計(jì)模式之建造者模式

    這篇文章主要介紹了C++設(shè)計(jì)模式之建造者模式,一個(gè)復(fù)雜對(duì)象是由多個(gè)部件組成的,建造者模式是把復(fù)雜對(duì)象的創(chuàng)建和部件的創(chuàng)建分別開(kāi)來(lái),分別用Builder類和Director類來(lái)表示,需要的朋友可以參考下
    2014-09-09
  • 詳解C語(yǔ)言中函數(shù)宏的三種封裝方式

    詳解C語(yǔ)言中函數(shù)宏的三種封裝方式

    函數(shù)宏,即包含多條語(yǔ)句的宏定義,其通常為某一被頻繁調(diào)用的功能的語(yǔ)句封裝,且不想通過(guò)函數(shù)方式封裝來(lái)降低額外的彈棧壓棧開(kāi)銷。本文就來(lái)聊聊函數(shù)宏的三種封裝方式吧
    2023-03-03
  • 深入探索C++中stack和queue的底層實(shí)現(xiàn)

    深入探索C++中stack和queue的底層實(shí)現(xiàn)

    這篇文章主要介紹了C++中的stack和dequeue的底層實(shí)現(xiàn),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-09-09
  • Qt中暫停程序的幾種方法小結(jié)

    Qt中暫停程序的幾種方法小結(jié)

    本文主要介紹了Qt中暫停程序的幾種方法小結(jié),包含了4種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-07-07
  • C語(yǔ)言示例講解for循環(huán)的用法

    C語(yǔ)言示例講解for循環(huán)的用法

    初學(xué)C語(yǔ)言,常常遇到for循環(huán)中嵌套個(gè)for循環(huán),初學(xué)者對(duì)于這種形式總是一知半解,這次我就整理了常見(jiàn)的for循環(huán)嵌套for循環(huán)的題目,我們一起爭(zhēng)取一舉拿下這類題。學(xué)廢他們,以后再見(jiàn)到就不怕啦!每天都要學(xué)一點(diǎn)呀。加油,奮斗的我們
    2022-06-06
  • 使用C語(yǔ)言遞歸與非遞歸實(shí)現(xiàn)字符串反轉(zhuǎn)函數(shù)char *reverse(char *str)的方法

    使用C語(yǔ)言遞歸與非遞歸實(shí)現(xiàn)字符串反轉(zhuǎn)函數(shù)char *reverse(char *str)的方法

    本篇文章是對(duì)使用C語(yǔ)言遞歸與非遞歸實(shí)現(xiàn)字符串反轉(zhuǎn)函數(shù)char *reverse(char *str)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++實(shí)現(xiàn)LeetCode(75.顏色排序)

    C++實(shí)現(xiàn)LeetCode(75.顏色排序)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(75.顏色排序),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語(yǔ)言return, exit, abort的區(qū)別

    C語(yǔ)言return, exit, abort的區(qū)別

    這篇文章主要介紹了C語(yǔ)言return, exit, abort的區(qū)別,一般情況下,在C語(yǔ)言中退出一個(gè)程序用return,如果在main函數(shù)中,return在清理局部對(duì)象之后,會(huì)調(diào)用exit函數(shù),和return相比,exit并不會(huì)銷毀局部對(duì)象,下面一起進(jìn)入文章了解更詳細(xì)內(nèi)容吧,需要的朋友也可以參考一下
    2022-01-01

最新評(píng)論

德惠市| 安塞县| 奉新县| 龙州县| 应用必备| 福建省| 城固县| 南澳县| 耒阳市| 佛山市| 江都市| 荃湾区| 札达县| 唐河县| 常熟市| 格尔木市| 普格县| 五华县| 乾安县| 敦化市| 咸阳市| 平度市| 彰化市| 京山县| 宽甸| 广南县| 无为县| 右玉县| 普宁市| 安吉县| 天全县| 房产| 新干县| 安国市| 岳阳市| 玉环县| 西平县| 盐亭县| 庄浪县| 黄山市| 鄂州市|