自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

詳細(xì)介紹內(nèi)聯(lián)函數(shù)的使用

開發(fā) 后端
內(nèi)聯(lián)函數(shù)從源代碼層看,有函數(shù)的結(jié)構(gòu),而在編譯后,卻不具備函數(shù)的性質(zhì)。編譯時(shí),類似宏替換,使用函數(shù)體替換調(diào)用處的函數(shù)名。本文詳細(xì)介紹內(nèi)聯(lián)函數(shù)的使用,一起來看。

類的成員函數(shù)可以分為內(nèi)聯(lián)函數(shù)和外聯(lián)函數(shù)。內(nèi)聯(lián)函數(shù)是指那些定義在類體內(nèi)的成員函數(shù),即該函數(shù)的函數(shù)體放在類體內(nèi)。而說明在類體內(nèi),定義在類體外的成員函數(shù)叫外聯(lián)函數(shù)。外聯(lián)函數(shù)的函數(shù)體在類的實(shí)現(xiàn)部分。

內(nèi)聯(lián)函數(shù)在調(diào)用時(shí)不是像一般的函數(shù)那樣要轉(zhuǎn)去執(zhí)行被調(diào)用函數(shù)的函數(shù)體,執(zhí)行完成后再轉(zhuǎn)回調(diào)用函數(shù)中,執(zhí)行其后語句,而是在調(diào)用函數(shù)處用內(nèi)聯(lián)函數(shù)體的代碼來替換,這樣將會(huì)節(jié)省調(diào)用開銷,提高運(yùn)行速度。

內(nèi)聯(lián)函數(shù)與前面講過的帶參數(shù)的宏定義進(jìn)行一下比較,它們的代碼效率是一樣的,但是內(nèi)聯(lián)函數(shù)要優(yōu)于宏定義,因?yàn)閮?nèi)聯(lián)函數(shù)遵循函數(shù)的類型和作用域規(guī)則,它與一般函數(shù)更相近,在一些編譯器中,一旦關(guān)上內(nèi)聯(lián)擴(kuò)展,將與一般函數(shù)一樣進(jìn)行調(diào)用,調(diào)試比較方便。

外聯(lián)函數(shù)變成內(nèi)聯(lián)函數(shù)的方法很簡單,只要在函數(shù)頭前面加上關(guān)鍵字inline就可以了。

  1. #include <iostream>   
  2. using namespace std;   
  3. class A   
  4. {   
  5. public:   
  6. A(int x, int y) //內(nèi)聯(lián)函數(shù)   
  7. {   
  8. X=x;Y=y;   
  9. }   
  10. int a() //內(nèi)聯(lián)函數(shù)   
  11. {   
  12. return X;   
  13. }   
  14. int b() //內(nèi)聯(lián)函數(shù)   
  15. {   
  16. return Y;   
  17. }   
  18. int c();   
  19. int d();   
  20. private:   
  21. int X,Y;   
  22. };   
  23. //inline定義內(nèi)聯(lián)函數(shù)   
  24. inline int A::c()   
  25. {   
  26. return a()+b();   
  27. }   
  28. inline int A::d()   
  29. {   
  30. return c();   
  31. }   
  32. void main()   
  33. {   
  34. A m(3,5);   
  35. int I=m.d();   
  36. cout<<"d()return:"<<I<<endl;   
  37. }  

輸出結(jié)果:

d()return:8

說明:類A中,直接定義了3個(gè)內(nèi)聯(lián)函數(shù),又使用inline定義了2個(gè)內(nèi)聯(lián)函數(shù)。

引入內(nèi)聯(lián)函數(shù)的意義

函數(shù)是一種更高級的抽象。它的引入使得編程者只關(guān)心函數(shù)的功能和使用方法,而不必關(guān)心函數(shù)功能的具體實(shí)現(xiàn);函數(shù)的引入可以減少程序的目標(biāo)代碼,實(shí)現(xiàn)程序代碼和數(shù)據(jù)的共享。但是,函數(shù)調(diào)用也會(huì)帶來降低效率的問題,因?yàn)檎{(diào)用函數(shù)實(shí)際上將程序執(zhí)行順序轉(zhuǎn)移到函數(shù)所存放在內(nèi)存中某個(gè)地址,將函數(shù)的程序內(nèi)容執(zhí)行完后,再返回到轉(zhuǎn)去執(zhí)行該函數(shù)前的地方。這種轉(zhuǎn)移操作要求在轉(zhuǎn)去前要保護(hù)現(xiàn)場并記憶執(zhí)行的地址,轉(zhuǎn)回后先要恢復(fù)現(xiàn)場,并按原來保存地址繼續(xù)執(zhí)行。

因此,函數(shù)調(diào)用要有一定的時(shí)間和空間方面的開銷,于是將影響其效率。特別是對于一些函數(shù)體代碼不是很大,但又頻繁地被調(diào)用的函數(shù)來講,解決其效率問題更為重要。引入內(nèi)聯(lián)函數(shù)實(shí)際上就是為了解決這一問題。

在程序編譯時(shí),編譯器將程序中出現(xiàn)的內(nèi)聯(lián)函數(shù)的調(diào)用表達(dá)式用內(nèi)聯(lián)函數(shù)的函數(shù)體來進(jìn)行替換。顯然,這種做法不會(huì)產(chǎn)生轉(zhuǎn)去轉(zhuǎn)回的問題,但是由于在編譯時(shí)將函數(shù)體中的代碼被替代到程序中,因此會(huì)增加目標(biāo)程序代碼量,進(jìn)而增加空間開銷,而在時(shí)間代銷上不象函數(shù)調(diào)用時(shí)那么大,可見它是以目標(biāo)代碼的增加為代價(jià)來換取時(shí)間的節(jié)省。

在程序中,調(diào)用其函數(shù)時(shí),該函數(shù)在編譯時(shí)被替代,而不是像一般函數(shù)那樣是在運(yùn)行時(shí)被調(diào)用。

使用內(nèi)聯(lián)函數(shù)應(yīng)注意的事項(xiàng)

內(nèi)聯(lián)函數(shù)具有一般函數(shù)的特性,它與一般函數(shù)所不同之處只在于函數(shù)調(diào)用的處理。一般函數(shù)進(jìn)行調(diào)用時(shí),要將程序執(zhí)行權(quán)轉(zhuǎn)到被調(diào)用函數(shù)中,然后再返回到調(diào)用它的函數(shù)中;而內(nèi)聯(lián)函數(shù)在調(diào)用時(shí),是將調(diào)用表達(dá)式用內(nèi)聯(lián)函數(shù)體來替換。在使用內(nèi)聯(lián)函數(shù)時(shí),應(yīng)注意如下幾點(diǎn):

1.在內(nèi)聯(lián)函數(shù)內(nèi)不允許用循環(huán)語句和開關(guān)語句。

如果內(nèi)聯(lián)函數(shù)有這些語句,則編譯將該函數(shù)視同普通函數(shù)那樣產(chǎn)生函數(shù)調(diào)用代碼,遞歸函數(shù)(自己調(diào)用自己的函數(shù))是不能被用來做內(nèi)聯(lián)函數(shù)的。內(nèi)聯(lián)函數(shù)只適合于只有1~5行的小函數(shù)。對一個(gè)含有許多語句的大函數(shù),函數(shù)調(diào)用和返回的開銷相對來說微不足道,所以也沒有必要用內(nèi)聯(lián)函數(shù)實(shí)現(xiàn)。

2.內(nèi)聯(lián)函數(shù)的定義必須出現(xiàn)在內(nèi)聯(lián)函數(shù)***次被調(diào)用之前。

3.本欄目講到的類結(jié)構(gòu)中所有在類說明內(nèi)部定義的函數(shù)是內(nèi)聯(lián)函數(shù)。

#p#

深入探究內(nèi)聯(lián)函數(shù)

內(nèi)聯(lián)函數(shù)——多么振奮人心的一項(xiàng)發(fā)明!它們看上去與函數(shù)很相像,它們擁有與函數(shù)類似的行為,它們要比宏(參見第 2 條)好用的多,同時(shí)你在調(diào)用它們時(shí)帶來的開銷比一般函數(shù)小得多??芍^“內(nèi)聯(lián)在手,別無他求。”

你得到的遠(yuǎn)遠(yuǎn)比你想象的要多,因?yàn)楣?jié)約函數(shù)調(diào)用的開銷僅僅是冰山一角。編譯器優(yōu)化通常是針對那些沒有函數(shù)調(diào)用的代碼,因此當(dāng)你編寫內(nèi)聯(lián)函數(shù)時(shí),編譯器就會(huì)針對函數(shù)體的上下文進(jìn)行優(yōu)化工作。然而大多數(shù)編譯器都不會(huì)針對“外聯(lián)”函數(shù)調(diào)用進(jìn)行優(yōu)化。

然而,在你的編程生涯中,“沒有免費(fèi)的午餐”這句生活哲言同樣奏效,內(nèi)聯(lián)函數(shù)不會(huì)幸免。內(nèi)聯(lián)函數(shù)背后蘊(yùn)含的理念是:用代碼本體來取代每次函數(shù)調(diào)用,這樣做很可能會(huì)是目標(biāo)代碼的體積增大不少,這一點(diǎn)并不是非要統(tǒng)計(jì)學(xué)博士才能看得清。對于內(nèi)存空間有限的機(jī)器而言,過分熱衷于使用內(nèi)聯(lián)則會(huì)造成函數(shù)占用過多的空間。即使在虛擬內(nèi)存中,那些冗余的內(nèi)聯(lián)代碼也會(huì)帶來不少無謂的分頁,從而使緩存讀取命中率降低,最終帶來性能的犧牲。

另一方面,如果一個(gè)內(nèi)聯(lián)函數(shù)體非常的短,那么為函數(shù)體所生成代碼的體積就會(huì)比為函數(shù)調(diào)用生成的代碼小一些。此時(shí),內(nèi)聯(lián)函數(shù)才真正做到了減小目標(biāo)代碼和提高緩存讀取命中率的目的。

我們要時(shí)刻保持清醒, Inline 是對編譯器的一次請求,而不是一條命令。這種請求可以顯式提出也可以隱式提出。隱式請求的途徑就是:在類定義的內(nèi)部定義函數(shù):

 

  1. class Person {   
  2. public:   
  3. ...   
  4. int age() const { return theAge; }  
  5. // 隱式內(nèi)聯(lián)請求 : 年齡 age 在類定義中做出定義  
  6. ...   
  7. private:   
  8. int theAge;   
  9. };  

 

這樣的函數(shù)通常是成員函數(shù),但是類中定義的函數(shù)也可以是友元(參見第 46 條),如果函數(shù)是友元,那么也應(yīng)隱式將它們定義為內(nèi)聯(lián)函數(shù)。

顯式聲明內(nèi)聯(lián)函數(shù)的方法為:在函數(shù)定義之前添加 inline 關(guān)鍵字。比如說,下面是標(biāo)準(zhǔn) max 模板(來自 <algorithm> )通常的定義方式:

 

  1. template<typename T> // 顯式內(nèi)聯(lián)請求:   
  2. inline const T& std::max(const T& a, const T& b)   
  3. return a < b ? b : a; } // 在 std::max 的前邊添加 ”inline”  

 

max 是一個(gè)模板這一事實(shí),讓我們不免得出這樣的推論:內(nèi)聯(lián)函數(shù)和模 板都應(yīng)該在頭文件中定義。這就使一些程序員做出“函數(shù)模板必須為內(nèi)聯(lián)函數(shù)”的論斷。這一結(jié)論不僅不合法,而且也存在潛在的害處,所以這里我們還是要大略的了解一下。

由于大多數(shù)構(gòu)建環(huán)境都是在編譯過程中進(jìn)行內(nèi)聯(lián),因此內(nèi)聯(lián)函數(shù)一般情況下都應(yīng)該定義在頭文件中。編譯器必須首先了解函數(shù)的大致情況,以便于用所調(diào)用函數(shù)體來代替這次函數(shù)調(diào)用。(一些構(gòu)建環(huán)境在連接過程中進(jìn)行內(nèi)聯(lián),還有個(gè)別基于 .NET 通用語言基礎(chǔ)結(jié)構(gòu)( CLI )的托管環(huán)境甚至是在運(yùn)行時(shí)進(jìn)行內(nèi)聯(lián)。這樣的環(huán)境僅僅屬于例外,而不是守則。在大多數(shù) C++ 程序中,內(nèi)聯(lián)是一個(gè)編譯時(shí)行為。)

模板通常保存在頭文件中,但是編譯器還需要了解模板的大致情形,以便于在用到時(shí)進(jìn)行正確的實(shí)例化。(然而,這并不是一成不變的。一些構(gòu)建環(huán)境在連接時(shí)進(jìn)行模板實(shí)例化。但是編譯時(shí)實(shí)例化才是更通用的方式。)

模板實(shí)例化相對于內(nèi)聯(lián)是獨(dú)立的。如果你正在編寫一個(gè)模板,而你又確信由這個(gè)模板所實(shí)例化出的所有函數(shù)都應(yīng)該是內(nèi)聯(lián)的,那么這個(gè)模板就應(yīng)該添 加 inline 關(guān)鍵字;這也就是上文中 std::max 實(shí) 現(xiàn)的做法。但是如果你正在編寫的模板并不需要實(shí)例化內(nèi)聯(lián)函數(shù),那么就不需要聲明內(nèi)聯(lián)模板(無論是顯式還是隱式)。

內(nèi)聯(lián)也是有開銷的,不假思索就引入內(nèi)聯(lián)的開銷的做法并不明智。我們已經(jīng)介紹過了內(nèi)聯(lián)是如何使代碼膨脹起來的(對于模板的作者而言,還應(yīng)該做更周密的考慮——參見第 44 條),但是內(nèi)聯(lián)還會(huì)帶來其他的開銷,這就是下文中我們將要討論的問題。

inline 是對編譯器的一次請求,但編譯器可能會(huì)忽略它。在我們的討論開 始之前,我們首先要弄清這一點(diǎn)。大多數(shù)編譯器如果認(rèn)為當(dāng)前的函數(shù)過于復(fù)雜(比如包括循環(huán)或遞歸的函數(shù)),或者這個(gè)函數(shù)是虛函數(shù)(即使是最平常的虛函數(shù)調(diào)用),就會(huì)拒絕將其內(nèi)聯(lián)。后一個(gè)結(jié)論很好理解。因?yàn)?virtual 意味著“等到運(yùn)行時(shí)再指出要調(diào)用哪個(gè)程序,”而 inline 意味著“在執(zhí)行程序之前,使用要調(diào)用的函數(shù)來代替這次調(diào)用。”如果編譯器不知道要調(diào)用哪個(gè)函數(shù),那么它們拒絕內(nèi)聯(lián)函數(shù)體的做法就無可厚非了。

綜上所述,我們得出下面的結(jié)論:一個(gè)給定的函數(shù)是否得到內(nèi)聯(lián),取決于你正在使用的構(gòu)建環(huán)境——主要是編譯器。幸運(yùn)的是,大多數(shù)編譯器擁有診斷機(jī)制,如果編譯器在內(nèi)聯(lián)函數(shù)時(shí)失敗了,那么它們將會(huì)做出警告。

有些時(shí)候,即使編譯器認(rèn)為某個(gè)函數(shù)非常適合進(jìn)行內(nèi)聯(lián),可是還是會(huì)為它提供一個(gè)函數(shù)體。舉例說,如果你的程序要取得某個(gè)內(nèi)聯(lián)函數(shù)的地址,那么編譯器必須用典型的方法為其創(chuàng)建一個(gè)外聯(lián)的函數(shù)體。那么編譯器又怎樣讓一個(gè)指針去指向一個(gè)不存在的函數(shù)呢?再加上編譯器一般不會(huì)通過對函數(shù)指針的調(diào)用進(jìn)行內(nèi)聯(lián)這一事實(shí),更能肯定這一結(jié)論:對于一個(gè)內(nèi)聯(lián)函數(shù)的調(diào)用是否應(yīng)該得到內(nèi)聯(lián),取決于這一調(diào)用是如何進(jìn)行的:

 

  1. inline void f() {...} // 假設(shè)編譯器樂意于將 f 的調(diào)用進(jìn)行內(nèi)聯(lián)   
  2. void (*pf)() = f; // pf 指向 f   
  3. ...   
  4. f(); // 此調(diào)用將被內(nèi)聯(lián),因?yàn)檫@是一次“正常”的調(diào)用   
  5. pf(); // 此調(diào)用很可能不會(huì)被內(nèi)聯(lián),因?yàn)樗峭ㄟ^一個(gè)函數(shù)指針進(jìn)行的  

 

即使你從未使用函數(shù)指針,未得到內(nèi)聯(lián)的函數(shù)依然“陰魂不散”,這是因?yàn)樾枨蠛瘮?shù)指針的不僅僅是程序員。比如,編譯器在為對象的數(shù)組進(jìn)行構(gòu)造或析構(gòu)時(shí),也會(huì)生成構(gòu)造函數(shù)和析構(gòu)函數(shù)的外聯(lián)副本,從而使它們可以得到這些函數(shù)的指針以便使用。

實(shí)際上,為構(gòu)造函數(shù)和析構(gòu)函數(shù)進(jìn)行內(nèi)聯(lián)通常不是一個(gè)好的選擇,這兩者甚至不如一些隨意挑選的“選手”。請看下面示例 中 Derived 類的構(gòu) 造函數(shù):

 

  1. class Base {   
  2. public:   
  3. ...   
  4. private:   
  5. std::string bm1, bm2; // 基類成員1和2   
  6. };   
  7. class Derived: public Base {   
  8. public:   
  9. Derived() {} // 派生類的構(gòu)造函數(shù)為空 — 還有別的可能 ?   
  10. ...   
  11. private:   
  12. std::string dm1, dm2, dm3;// 派生類成員 1–3   
  13. }; 

 

乍看上去,將這個(gè)構(gòu)造函數(shù)進(jìn)行內(nèi)聯(lián)再適合不過了,因?yàn)樗话魏未a。其實(shí)你的眼睛欺騙了你。

C++ 對于在創(chuàng)建和銷毀對象的過程中發(fā)生的事件進(jìn)行了多方面的保證。比如,當(dāng)你使用 new 時(shí),你動(dòng)態(tài)創(chuàng)建的對象的構(gòu)造函數(shù)就會(huì)自動(dòng)將其初始化;當(dāng)你使用 delete 時(shí),將調(diào)用相關(guān)的析構(gòu)函數(shù)。當(dāng)你創(chuàng)建一個(gè)對象時(shí)。每個(gè)基類和該對象中的每個(gè)數(shù)據(jù)成員將自動(dòng)得到構(gòu)造,在銷毀這個(gè)對象時(shí),針對兩者的析構(gòu)過程將會(huì)自動(dòng)進(jìn)行。如果在對象的構(gòu)造過程中有異常拋出,那么對象中已經(jīng)得到構(gòu)造的部分將統(tǒng)統(tǒng)被自動(dòng)銷毀。

在所有這些場景中, C++ 告訴你什么一定會(huì)發(fā)生,但它沒有說明如何發(fā)生。這一點(diǎn)取決于編譯器的實(shí)現(xiàn)者,但是必須要清楚的一點(diǎn)是,這些事情并不是自發(fā)的。你必須要在程序中添加一些代碼來實(shí)現(xiàn)它們。這些代碼一定存在于某處,它們由編譯器代勞,用于在編譯過程中插入你的程序中。一些時(shí)候它們就存在于構(gòu)造函數(shù)和析構(gòu)函數(shù)中,所以,對于上文中 Derived 的空構(gòu)造函數(shù),我們可以將具體實(shí)現(xiàn)中生成的代碼等價(jià)看作:

 

  1. Derived::Derived() // Derived 空構(gòu)造函數(shù)的抽象實(shí)現(xiàn)   
  2. {   
  3. Base::Base(); // 初始化 Base 部分   
  4. try { dm1.std::string::string(); } // 嘗試構(gòu)造 dm1   
  5. catch (...) { // 如果拋出異常 ,   
  6. Base::~Base(); // 銷毀基類部分 ,   
  7. throw// 并且傳播該異常   
  8. }   
  9.  
  10. try { dm2.std::string::string(); } // 嘗試構(gòu)造 dm2   
  11. catch(...) { // 如果拋出異常 ,   
  12. dm1.std::string::~string(); // 銷毀 dm1,   
  13. Base::~Base(); // 銷毀基類部分 ,   
  14. throw// 并且傳播該異常   
  15. }   
  16. try { dm3.std::string::string(); } // 嘗試構(gòu)造 dm3   
  17. catch(...) { // 如果拋出異常 ,   
  18. dm2.std::string::~string(); // 銷毀 dm2,   
  19. dm1.std::string::~string(); // 銷毀 dm1,   
  20. Base::~Base(); // 銷毀基類部分 ,   
  21. throw// 并且傳播該異常   
  22. }   
  23. }  

 

這段代碼并不能完全真實(shí)反映出編譯器所做的事情,因?yàn)檎鎸?shí)的編譯器采用的做法更加復(fù)雜。然而,上面的代碼可以較為精確地反映出 Derived 的“空”構(gòu)造函數(shù)必須要提供的內(nèi)容。無論編譯器處理異常的實(shí)現(xiàn)方式多么復(fù)雜, Derived 的構(gòu)造函數(shù)必須至少為其數(shù)據(jù)成員和基類調(diào)用構(gòu)造函數(shù),這些調(diào)用(可能就是內(nèi)聯(lián)的)會(huì)使 Derived 顯得不那么適合進(jìn)行內(nèi)聯(lián)。

這 一推理過程對于 Base 的構(gòu)造函數(shù)同樣適用,因此如果將 Base 內(nèi)聯(lián),所有添加進(jìn)其中的代碼同樣也會(huì)添加進(jìn) Derived 的構(gòu)造函數(shù)中(通過 Derived 構(gòu)造函數(shù)調(diào)用 Base 構(gòu)造函數(shù)的過程)。同時(shí),如果 string 的構(gòu)造函數(shù)恰巧被內(nèi)聯(lián)了,那么 Derived 的構(gòu)造函數(shù)將為其復(fù)制出五份副本,分別對應(yīng) Derived 對象中包含的五個(gè)字符串(兩個(gè)繼承而來,另外三個(gè)系對象本身包括)。

現(xiàn)在,“Derived 的構(gòu)造函數(shù)是否應(yīng)該內(nèi)聯(lián)不是一個(gè)純機(jī)械化問題”就很容易理解了。對于 Derived 的析構(gòu)函數(shù)也一樣,你必須親自關(guān)注 Derived 的構(gòu)造函數(shù)初始化的對象是否全部恰當(dāng)?shù)牡玫戒N毀,這一點(diǎn)機(jī)器無法代替。

庫設(shè)計(jì)者必須估算出將函數(shù)內(nèi)聯(lián)所帶來的影響,因?yàn)槟愀緹o法為庫中客戶端程序員可見的內(nèi)聯(lián)函數(shù)提供底層的升級。換句話說,如果 f 是庫中的一個(gè)內(nèi)聯(lián)函數(shù),那么庫的客戶端程序員就會(huì)將 f 的函數(shù)體編譯進(jìn)他們的程序中。隨后,如果一個(gè)庫實(shí)現(xiàn)者修改了 f 的內(nèi)容,那么所有曾經(jīng)使用過 f 的客戶端程序員必須要重新編譯他們的代碼。這一點(diǎn)是我們所不希望看到的。

另一個(gè)角度講,如果 f 不是內(nèi)聯(lián)函數(shù),那么修改 f 只需要客戶端程序員重新連接一下就可以了。這樣要比重新編譯減少很多繁雜的工作,并且,如果庫中需要使用的函數(shù)是動(dòng)態(tài)鏈接的,那么它對于客戶端程序員就是完全透明的。

我們的目標(biāo)是開發(fā)優(yōu)質(zhì)的程序,因此要將這些重要問題牢記在心。但是以編寫代碼實(shí)際操作的角度來說,這一個(gè)事實(shí)將淹沒一切:大多數(shù)調(diào)試人員面對內(nèi)聯(lián)函數(shù)時(shí)會(huì)遇到麻煩。這并不會(huì)令人意外,因?yàn)槟銦o法為一個(gè)尚不存在的函數(shù)設(shè)定一個(gè)跟蹤點(diǎn)。一些構(gòu)建環(huán)境試圖支持內(nèi)聯(lián)函數(shù)的調(diào)試,但是幾乎都失敗了,大多數(shù)環(huán)境都是在調(diào)試過程中直接禁止內(nèi)聯(lián)。

對于“哪個(gè)函數(shù)應(yīng)該聲明為 inline 而哪些不應(yīng)該”這一問題,我們可以由上文中引出一個(gè)邏輯上的策略。起初,不要內(nèi)聯(lián)任何內(nèi)容,或者僅挑選出那些不得不內(nèi)聯(lián)的函數(shù)(參見第 46 條)或者那些確實(shí)是很細(xì)小的程序(比如本節(jié)開篇處出現(xiàn)的 Person::age )進(jìn)行內(nèi)聯(lián)。謹(jǐn)慎引入內(nèi)聯(lián),你就為調(diào)試工作提供了方便,但是你仍然要為內(nèi)聯(lián)擺正位置:它屬于手工的優(yōu)化操作。

不要忘記 80-20 經(jīng)驗(yàn)決定主義原則:一個(gè)典型的程序?qū)⒒ㄈ?80% 的時(shí)間僅僅運(yùn)行 20% 的代碼。這是一個(gè)非常重要的原則,因?yàn)樗鼤r(shí)時(shí)刻刻提醒我們,軟件開發(fā)者的目標(biāo)是:找出你的代碼中 20% 的這部分進(jìn)行優(yōu)化,從而從整體上提高程序的性能。你可以花費(fèi)很長的時(shí)間進(jìn)行內(nèi)聯(lián)、修改函數(shù)等等,但如果你沒有鎖定正確的目標(biāo),那么你做再多的努力也是徒勞。

結(jié)論:

僅僅對小型的、調(diào)用頻率高的程序進(jìn)行內(nèi)聯(lián)。這將簡化你的調(diào)試操作,為底層更新提供方便,降低潛在的代碼膨脹發(fā)生的可能,并且可以讓程序獲得更高的速度。不要將模板聲明為 inline 的,因?yàn)樗鼈円话阍陬^文件中出現(xiàn)。

希望對你有幫助。

【編輯推薦】

  1. 解析C++和C的區(qū)別
  2. 淺談C++調(diào)用C#的DLL程序方法
  3. C++中static的用法總結(jié)
  4. C++十大熱門關(guān)鍵字
  5. 階乘相關(guān)的算法及其C++實(shí)現(xiàn)
責(zé)任編輯:于鐵 來源: 互聯(lián)網(wǎng)
相關(guān)推薦

2010-02-01 15:47:04

C++內(nèi)聯(lián)函數(shù)

2011-06-20 09:34:17

優(yōu)化函數(shù)

2011-07-12 17:18:23

PHPstrtotime

2009-12-02 20:15:12

PHP header函

2011-07-13 11:34:58

CC++時(shí)間函數(shù)

2009-12-10 09:59:49

PHP讀取目錄函數(shù)

2010-03-11 11:07:37

Python函數(shù)參數(shù)

2010-03-09 16:11:59

Linux重定向

2010-03-04 11:07:24

Linux finge

2011-07-05 17:29:56

2010-03-04 10:54:45

Linux telne

2011-07-15 01:20:58

C指針函數(shù)函數(shù)指針

2011-07-20 17:16:50

C++重載函數(shù)

2009-06-25 14:59:39

jQuery.exte

2011-07-20 16:43:34

C++

2011-06-15 15:16:54

Session

2010-06-02 09:01:20

Linux core

2009-08-21 15:16:23

C#使用指針

2010-03-09 09:55:14

Linux mount

2017-10-30 16:50:41

Linuxconst
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號