日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

《提高c++性能的编程技术》读书笔记

發(fā)布時間:2023/12/18 c/c++ 23 如意码农
生活随笔 收集整理的這篇文章主要介紹了 《提高c++性能的编程技术》读书笔记 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一個程序的執(zhí)行效率是取決于改程序翻譯成匯編語言之后的執(zhí)行的機器指令的條數(shù)。而每一個機器指令的執(zhí)行的周期是一定的。C語言和C++都是高于匯編語言的高級語言,其中,C語言源代碼與其相應(yīng)的機器指不是完全同一的,但是大致是線性的,但是C++語言的源代碼與編譯代碼的開銷變化很大的。一條C++指令可能對應(yīng)于3條匯編指令,而另外的一條可能對應(yīng)300條。正因為這樣,很多時候我們寫出來的代碼本身就是低效的,這不能全然怪罪于C++語言本身,那么真正的軟件的低效又體現(xiàn)在什么地方呢?這本書給了我們答案:軟件的效率是由設(shè)計的效率以及編碼的效率來決定的,其中,設(shè)計的效率關(guān)乎程序的高層設(shè)計,也就是說你要有把握全局的能力,在很大的程度上,這與語言本身并沒有關(guān)系,無論再怎么高效的語言都彌補不了糟糕的全局設(shè)計。同時,書中也在每一點上給了我們實際的建議:

1、c++臨時對象

創(chuàng)建對象是一個費時,費空間的操作,會產(chǎn)生臨時對象的幾種情況:

1)以值的方式給函數(shù)傳參 
按值傳遞時,首先將需要傳給函數(shù)的參數(shù),調(diào)用拷貝構(gòu)造函數(shù)創(chuàng)建一個副本,所有在函數(shù)里的操作都是針對這個副本的,也正是因為這個原因,在函數(shù)體里對該副本進行任何操作,都不會影響原參數(shù)。

指導(dǎo)原則:在傳遞函數(shù)參數(shù)時,選擇以常量引用的方式,而不是傳值方式。

2)類型轉(zhuǎn)換 
我們在做類型轉(zhuǎn)換時,轉(zhuǎn)換后的對象通常是一個臨時對象。

構(gòu)造函數(shù)應(yīng)該避免隱式類型轉(zhuǎn)換,會隱含產(chǎn)生臨時變量。用explicit constructor代替隱式轉(zhuǎn)換。

3)函數(shù)需要返回一個對象時 
當(dāng)函數(shù)需要返回一個對象,他會在棧中創(chuàng)建一個臨時對象,存儲函數(shù)的返回值。

4)對于大部分容器(包括鏈表)而言,調(diào)用容器的end()函數(shù)將返回一個臨時對象,并且這個對象需要被構(gòu)造和析構(gòu)。由于這個臨時對象的值在循環(huán)中是不會改變的,因此如果在每次循環(huán)迭代中都重新計算,將會導(dǎo)致不必要的開銷,實際上這個臨時對象只需計算一次,將其保存到局部對象當(dāng)中即可。

5)使用后置++時會產(chǎn)生臨時對象,應(yīng)多使用前置++。

2、重載、覆蓋和隱藏

1)對函數(shù)f()進行重載(overload)是指,在相同作用域中定義另一個相同名字的函數(shù),并且與f()有著不同的參數(shù)類型、順序或數(shù)目。 
2)對虛函數(shù)f()進行覆蓋(override)是指,在派生類中定義一個相同名字的函數(shù),并且這個函數(shù)的參數(shù)列表與f()相同。 
3)對外層作用域(基類、外部類或名字空間)中的函數(shù)f()進行隱藏(hide)是指,在內(nèi)層作用域中(派生類、嵌套類或嵌套名字空間)定義另一個相同名字的函數(shù),這將隱藏定義在外層作用域中的同名函數(shù)。

3、虛函數(shù)(模板對繼承的優(yōu)勢)

利用好虛函數(shù)的優(yōu)點:動態(tài)綁定,以及節(jié)省代碼。盡量避免虛函數(shù)帶來的開銷。

1)虛函數(shù)的開銷可分為三種:

  1. 必須在構(gòu)造函數(shù)內(nèi)初始化vptr:這個相當(dāng)于是在不使用虛函數(shù)的類中內(nèi)置一個type變量的開銷,是值得的,不討論。
  2. 需要使用指針間接跳轉(zhuǎn):相當(dāng)于在switch中通過type來調(diào)用相應(yīng)版本函數(shù)的開銷,不討論。
  3. 虛函數(shù)不能內(nèi)聯(lián):這個是關(guān)注點。

2)方案1:不繼承

不繼承的話就是將各子類獨立出來,缺點是在代碼中會充斥大量的switch,非常沒有靈活性,排除。

3) 方案2:繼承

繼承的缺點如3.2.1所述,成員函數(shù)無法內(nèi)聯(lián),尤其是非常短小使用頻繁的函數(shù),會增加大量開銷。

4) 方案3:模板

使用模板來實現(xiàn)隱式接口:

4、內(nèi)存池

內(nèi)存池(Memory Pool)是一種內(nèi)存分配方式。 通常我們習(xí)慣直接使用new、malloc等API申請分配內(nèi)存,這樣做的缺點在于:由于所申請內(nèi)存塊的大小不定,當(dāng)頻繁使用時會造成大量的內(nèi)存碎片并進而降低性能。

內(nèi)存池則是在真正使用內(nèi)存之前,先申請分配一定數(shù)量的、大小相等(一般情況下)的內(nèi)存塊留作備用。當(dāng)有新的內(nèi)存需求時,就從內(nèi)存池中分出一部分內(nèi)存塊,若內(nèi)存塊不夠再繼續(xù)申請新的內(nèi)存。這樣做的一個顯著優(yōu)點是盡量避免了內(nèi)存碎片,使得內(nèi)存分配效率得到提升。

5、內(nèi)聯(lián)

內(nèi)聯(lián)是用方法的代碼來替換對方法的調(diào)用。內(nèi)聯(lián)通過消除調(diào)用開銷來提升性能,并且允許進行調(diào)用間優(yōu)化。內(nèi)聯(lián)的主要作用是對運行時間進行優(yōu)化,當(dāng)然他也可以使可執(zhí)行映像變得更小。總結(jié)如下:

內(nèi)聯(lián)提升性能的兩個方面: 
1)調(diào)用間優(yōu)化 
調(diào)用間優(yōu)化是面向某一方法的調(diào)用過程,基于對上下文場景更加全面的理解,使得編譯器在源代碼層面及機器代碼層面對方法進行優(yōu)化。這種優(yōu)化的一般形式為:在編譯期間進行一部分預(yù)處理,避免在運行時重復(fù)類似過程。 
2)避免開銷大的方法調(diào)用

內(nèi)聯(lián)缺點:1)代碼膨脹。2)有些方法本身應(yīng)避免內(nèi)聯(lián),如遞歸。如果將遞歸函數(shù)A內(nèi)聯(lián),編譯器將不斷循環(huán)嘗試將A方法插入到A方法中,形成死循環(huán)。

總結(jié)

以上是生活随笔為你收集整理的《提高c++性能的编程技术》读书笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。