上節(jié)我們分析了C++基礎(chǔ)語(yǔ)法的const,static以及 this 指針,那么這節(jié)內(nèi)容我們來(lái)看一下 inline 內(nèi)聯(lián)函數(shù)吧!
inline 內(nèi)聯(lián)函數(shù)
特征
相當(dāng)于把內(nèi)聯(lián)函數(shù)里面的內(nèi)容寫(xiě)在調(diào)用內(nèi)聯(lián)函數(shù)處;
相當(dāng)于不用執(zhí)行進(jìn)入函數(shù)的步驟,直接執(zhí)行函數(shù)體;
相當(dāng)于宏,卻比宏多了類型檢查,真正具有函數(shù)特性;
編譯器一般不內(nèi)聯(lián)包含循環(huán)、遞歸、switch 等復(fù)雜操作的內(nèi)聯(lián)函數(shù);
在類聲明中定義的函數(shù),除了虛函數(shù)的其他函數(shù)都會(huì)自動(dòng)隱式地當(dāng)成內(nèi)聯(lián)函數(shù)。
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,。。。) {/****/};
// 類內(nèi)定義,隱式內(nèi)聯(lián)class A { int doA() { return 0; } // 隱式內(nèi)聯(lián)}
// 類外定義,需要顯式內(nèi)聯(lián)class A { int doA();}inline int A::doA() { return 0; } // 需要顯式內(nèi)聯(lián)
編譯器對(duì) inline 函數(shù)的處理步驟
將 inline 函數(shù)體復(fù)制到 inline 函數(shù)調(diào)用點(diǎn)處;
為所用 inline 函數(shù)中的局部變量分配內(nèi)存空間;
將 inline 函數(shù)的的輸入?yún)?shù)和返回值映射到調(diào)用方法的局部變量空間中;
如果 inline 函數(shù)有多個(gè)返回點(diǎn),將其轉(zhuǎn)變?yōu)?inline 函數(shù)代碼塊末尾的分支(使用 GOTO)。
優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
內(nèi)聯(lián)函數(shù)同宏函數(shù)一樣將在被調(diào)用處進(jìn)行代碼展開(kāi),省去了參數(shù)壓棧、棧幀開(kāi)辟與回收,結(jié)果返回等,從而提高程序運(yùn)行速度。
內(nèi)聯(lián)函數(shù)相比宏函數(shù)來(lái)說(shuō),在代碼展開(kāi)時(shí),會(huì)做安全檢查或自動(dòng)類型轉(zhuǎn)換(同普通函數(shù)),而宏定義則不會(huì)。
在類中聲明同時(shí)定義的成員函數(shù),自動(dòng)轉(zhuǎn)化為內(nèi)聯(lián)函數(shù),因此內(nèi)聯(lián)函數(shù)可以訪問(wèn)類的成員變量,宏定義則不能。
內(nèi)聯(lián)函數(shù)在運(yùn)行時(shí)可調(diào)試,而宏定義不可以。
缺點(diǎn)
代碼膨脹。內(nèi)聯(lián)是以代碼膨脹(復(fù)制)為代價(jià),消除函數(shù)調(diào)用帶來(lái)的開(kāi)銷。如果執(zhí)行函數(shù)體內(nèi)代碼的時(shí)間,相比于函數(shù)調(diào)用的開(kāi)銷較大,那么效率的收獲會(huì)很少。另一方面,每一處內(nèi)聯(lián)函數(shù)的調(diào)用都要復(fù)制代碼,將使程序的總代碼量增大,消耗更多的內(nèi)存空間。
inline 函數(shù)無(wú)法隨著函數(shù)庫(kù)升級(jí)而升級(jí)。inline函數(shù)的改變需要重新編譯,不像 non-inline 可以直接鏈接。
是否內(nèi)聯(lián),程序員不可控。內(nèi)聯(lián)函數(shù)只是對(duì)編譯器的建議,是否對(duì)函數(shù)內(nèi)聯(lián),決定權(quán)在于編譯器。
虛函數(shù)(virtual)可以是內(nèi)聯(lián)函數(shù)(inline)嗎?
虛函數(shù)可以是內(nèi)聯(lián)函數(shù),內(nèi)聯(lián)是可以修飾虛函數(shù)的,但是當(dāng)虛函數(shù)表現(xiàn)多態(tài)性的時(shí)候不能內(nèi)聯(lián)。
內(nèi)聯(lián)是在編譯器建議編譯器內(nèi)聯(lián),而虛函數(shù)的多態(tài)性在運(yùn)行期,編譯器無(wú)法知道運(yùn)行期調(diào)用哪個(gè)代碼,因此虛函數(shù)表現(xiàn)為多態(tài)性時(shí)(運(yùn)行期)不可以內(nèi)聯(lián)。
inline virtual 唯一可以內(nèi)聯(lián)的時(shí)候是:編譯器知道所調(diào)用的對(duì)象是哪個(gè)類(如 Base::who()),這只有在編譯器具有實(shí)際對(duì)象而不是對(duì)象的指針或引用時(shí)才會(huì)發(fā)生。
虛函數(shù)內(nèi)聯(lián)使用
#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() // 不寫(xiě)inline時(shí)隱式內(nèi)聯(lián){ cout 《《 “I am Derived
”; }};
int main(){ // 此處的虛函數(shù) who(),是通過(guò)類(Base)的具體對(duì)象(b)來(lái)調(diào)用的,編譯期間就能確定了,所以它可以是內(nèi)聯(lián)的,但最終是否內(nèi)聯(lián)取決于編譯器。 Base b; b.who();
// 此處的虛函數(shù)是通過(guò)指針調(diào)用的,呈現(xiàn)多態(tài)性,需要在運(yùn)行時(shí)期間才能確定,所以不能為內(nèi)聯(lián)。 Base *ptr = new Derived(); ptr-》who();
// 因?yàn)锽ase有虛析構(gòu)函數(shù)(virtual ~Base() {}),所以 delete 時(shí),會(huì)先調(diào)用派生類(Derived)析構(gòu)函數(shù),再調(diào)用基類(Base)析構(gòu)函數(shù),防止內(nèi)存泄漏。 delete ptr; ptr = nullptr;
system(“pause”); return 0;}
那么今天的分享就到這里了,希望對(duì)大家有幫助~喜歡的話可以支持一下喲!
寫(xiě)在最后:對(duì)于準(zhǔn)備學(xué)習(xí)C/C++編程的小伙伴,如果你想更好的提升你的編程核心能力(內(nèi)功)不妨從現(xiàn)在開(kāi)始!
編輯:jq
-
Switch
+關(guān)注
關(guān)注
1文章
542瀏覽量
61781 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4417瀏覽量
67549 -
C++
+關(guān)注
關(guān)注
22文章
2124瀏覽量
77151 -
編譯器
+關(guān)注
關(guān)注
1文章
1672瀏覽量
51664
發(fā)布評(píng)論請(qǐng)先 登錄
keil實(shí)現(xiàn)c與c++混合編程
C語(yǔ)言與C++的區(qū)別及聯(lián)系
內(nèi)聯(lián)函數(shù)介紹
C與C++之間的聯(lián)系
C語(yǔ)言和C++之間的區(qū)別是什么
C++程序異常的處理機(jī)制
inline ASM(內(nèi)聯(lián)匯編)的細(xì)節(jié)分享
簡(jiǎn)單的內(nèi)聯(lián)匯編介紹
RISC-V的工具鏈GCC內(nèi)聯(lián)匯編
GCC內(nèi)聯(lián)匯編
通過(guò)內(nèi)聯(lián)匯編調(diào)用乘法指令mulh\\mulhsu\\mulhu
強(qiáng)實(shí)時(shí)運(yùn)動(dòng)控制內(nèi)核MotionRT750(六):us級(jí)高速交互之C++,為智能裝備提速
將TLE9140 DeviceDriver移植到TLE9893時(shí)出現(xiàn)未知類型名稱“INLINE”,如何解決?
C語(yǔ)言中的內(nèi)聯(lián)函數(shù)與宏
C++基礎(chǔ)語(yǔ)法之inline 內(nèi)聯(lián)函數(shù)
評(píng)論