溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C++內(nèi)聯(lián)成員函數(shù)怎么使用

發(fā)布時間:2021-12-21 17:05:05 來源:億速云 閱讀:150 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容主要講解“C++內(nèi)聯(lián)成員函數(shù)怎么使用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“C++內(nèi)聯(lián)成員函數(shù)怎么使用”吧!

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

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

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

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

要使任何函數(shù)成為內(nèi)聯(lián)函數(shù),在其定義的開頭使用關(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);
 
}

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

第一種情況:

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

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

第二種情況:

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

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

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

第三種情況:

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

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

鏈接屬性:

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

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

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

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

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

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

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

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

優(yōu)點 :

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

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

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

4. 它通過利用指令緩存來更多使用本地引用。

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

缺點 :

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

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

3.  當(dāng)在頭文件中使用時,它使你的頭文件變得更大,因為用戶并不關(guān)心這些信息。

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

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

關(guān)鍵點 :

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

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

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

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

5. 模板方法/函數(shù)并不總是被內(nèi)聯(lián)的(它們在頭文件中的存在不會使它們自動內(nèi)聯(lián))。

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

到此,相信大家對“C++內(nèi)聯(lián)成員函數(shù)怎么使用”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI