《提高c++性能的编程技术》读书笔记
一個程序的執行效率是取決于改程序翻譯成匯編語言之后的執行的機器指令的條數。而每一個機器指令的執行的周期是一定的。C語言和C++都是高于匯編語言的高級語言,其中,C語言源代碼與其相應的機器指不是完全同一的,但是大致是線性的,但是C++語言的源代碼與編譯代碼的開銷變化很大的。一條C++指令可能對應于3條匯編指令,而另外的一條可能對應300條。正因為這樣,很多時候我們寫出來的代碼本身就是低效的,這不能全然怪罪于C++語言本身,那么真正的軟件的低效又體現在什么地方呢?這本書給了我們答案:軟件的效率是由設計的效率以及編碼的效率來決定的,其中,設計的效率關乎程序的高層設計,也就是說你要有把握全局的能力,在很大的程度上,這與語言本身并沒有關系,無論再怎么高效的語言都彌補不了糟糕的全局設計。同時,書中也在每一點上給了我們實際的建議:
1、c++臨時對象
創建對象是一個費時,費空間的操作,會產生臨時對象的幾種情況:
1)以值的方式給函數傳參
按值傳遞時,首先將需要傳給函數的參數,調用拷貝構造函數創建一個副本,所有在函數里的操作都是針對這個副本的,也正是因為這個原因,在函數體里對該副本進行任何操作,都不會影響原參數。
指導原則:在傳遞函數參數時,選擇以常量引用的方式,而不是傳值方式。
2)類型轉換
我們在做類型轉換時,轉換后的對象通常是一個臨時對象。
構造函數應該避免隱式類型轉換,會隱含產生臨時變量。用explicit constructor代替隱式轉換。
3)函數需要返回一個對象時
當函數需要返回一個對象,他會在棧中創建一個臨時對象,存儲函數的返回值。
4)對于大部分容器(包括鏈表)而言,調用容器的end()函數將返回一個臨時對象,并且這個對象需要被構造和析構。由于這個臨時對象的值在循環中是不會改變的,因此如果在每次循環迭代中都重新計算,將會導致不必要的開銷,實際上這個臨時對象只需計算一次,將其保存到局部對象當中即可。
5)使用后置++時會產生臨時對象,應多使用前置++。
2、重載、覆蓋和隱藏
1)對函數f()進行重載(overload)是指,在相同作用域中定義另一個相同名字的函數,并且與f()有著不同的參數類型、順序或數目。
2)對虛函數f()進行覆蓋(override)是指,在派生類中定義一個相同名字的函數,并且這個函數的參數列表與f()相同。
3)對外層作用域(基類、外部類或名字空間)中的函數f()進行隱藏(hide)是指,在內層作用域中(派生類、嵌套類或嵌套名字空間)定義另一個相同名字的函數,這將隱藏定義在外層作用域中的同名函數。
3、虛函數(模板對繼承的優勢)
利用好虛函數的優點:動態綁定,以及節省代碼。盡量避免虛函數帶來的開銷。
1)虛函數的開銷可分為三種:
- 必須在構造函數內初始化vptr:這個相當于是在不使用虛函數的類中內置一個type變量的開銷,是值得的,不討論。
- 需要使用指針間接跳轉:相當于在switch中通過type來調用相應版本函數的開銷,不討論。
- 虛函數不能內聯:這個是關注點。
2)方案1:不繼承
不繼承的話就是將各子類獨立出來,缺點是在代碼中會充斥大量的switch,非常沒有靈活性,排除。
3) 方案2:繼承
繼承的缺點如3.2.1所述,成員函數無法內聯,尤其是非常短小使用頻繁的函數,會增加大量開銷。
4) 方案3:模板
使用模板來實現隱式接口:
4、內存池
內存池(Memory Pool)是一種內存分配方式。 通常我們習慣直接使用new、malloc等API申請分配內存,這樣做的缺點在于:由于所申請內存塊的大小不定,當頻繁使用時會造成大量的內存碎片并進而降低性能。
內存池則是在真正使用內存之前,先申請分配一定數量的、大小相等(一般情況下)的內存塊留作備用。當有新的內存需求時,就從內存池中分出一部分內存塊,若內存塊不夠再繼續申請新的內存。這樣做的一個顯著優點是盡量避免了內存碎片,使得內存分配效率得到提升。
5、內聯
內聯是用方法的代碼來替換對方法的調用。內聯通過消除調用開銷來提升性能,并且允許進行調用間優化。內聯的主要作用是對運行時間進行優化,當然他也可以使可執行映像變得更小。總結如下:
內聯提升性能的兩個方面:
1)調用間優化
調用間優化是面向某一方法的調用過程,基于對上下文場景更加全面的理解,使得編譯器在源代碼層面及機器代碼層面對方法進行優化。這種優化的一般形式為:在編譯期間進行一部分預處理,避免在運行時重復類似過程。
2)避免開銷大的方法調用
內聯缺點:1)代碼膨脹。2)有些方法本身應避免內聯,如遞歸。如果將遞歸函數A內聯,編譯器將不斷循環嘗試將A方法插入到A方法中,形成死循環。
總結
以上是生活随笔為你收集整理的《提高c++性能的编程技术》读书笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Vb.net MakeLong MAKE
- 下一篇: 湿地水质监测仪检测仪产品突出的亮点