C++高級編程篇-如何編寫高效的C++篇

為了編寫高效的程序,需要在設計層次上做考慮,並在實現層次上考慮細節。(一定要在程序的生命週期已開始就考慮性能)。

“編寫高效的C++程序”指要編寫能高效運行的程序,而不是高效地編寫程序,要學會如何節省用戶的時間,而不是節省你自己的時間。

C++高級編程篇-如何編寫高效的C++篇


1、實現高效的兩種方法

如果想編寫真正高性能的應用,就必須從設計一開始就考慮效率問題。設計級效率包括:選擇高效算法,避免不必要的步驟和計算,而且要選擇適當的設計優化。

2、C++是一種低效語言嗎

C++包括一些高級構造,如異常和虛方法,這些構造都相當的慢。

C++語言有一個一般性的設計原則:如果不用它,就不必為之付出。(如果不使用虛方法,就不用付出使用虛方法的性能代價。)

好的優化編譯器可以自動完成某些語言級優化,請檢查編譯器文檔,瞭解有關細節。

1、高效的處理對象

①、傳引用

對象應該很少按值傳遞給函數或方法。

總體來說,如果一個函數要修改一個對象,可以簡單的按引用傳遞對象;如果函數不會修改對象,則應按const引用來傳遞。

②、按引用返回

應當按引用從函數返回對象,以避免不必要的複製。(不能返回一個局部對象的引用和指針)。

③、按引用捕獲異常

應當按引用捕獲異常,避免額外的複製。[異常在性能方面是重量級的,因此在異常方面做小幅改進也會大大改善效率。]

④、避免創建臨時對象

很多情況下,編譯器會創建臨時的匿名對象。

⑤、返回值優化

按值返回對象的函數可能導致創建一個臨時對象。[一般編譯器會把大多數情況下的臨時變量予以優化,這種優化稱為返回值優化]

2、不要過度使用高開銷的語言特性

從執行速度方面看,許多C++特性的開銷都很大,異常、虛函數、RTTI(運行時類型識別)更是首當其衝。即使在程序中沒有顯式地使用異常和RTTI特性,這個特性也會帶來性能開銷,僅僅是因為可能會用到這些特性,為了對此提供支持,都會在執行中增加額外的步驟。

[編譯器可以指定允許指定編譯程序的方式,即:編譯程序時根本不支持這些特性。]

如:Linux g++ 3.2.2

如果g++指定標誌來禁用異常:g++ -fon-exceptions test.cpp

如果g++制定標誌禁用RTTI:g++ -fon-rtti test.cpp [編譯器會成功編譯,但是無法運行]。

3、使用內聯方法和函數

程序員的內聯請求只是對編譯器提出一個建議,即使你想內聯某個函數,編譯器也可以拒絕內聯該函數。

另一方面,一些編譯器會在完成優化的步驟中,對適當的函數和方法進行內聯,即使這些函數沒有標記inline關鍵字。[編譯器文檔查詢]

三,設計效率

程序中的設計選擇對性能的影響遠遠超過了語言級選擇的影響。[選擇合適的算法]

優化程序的三個設計技術:緩存、對象池、線程池。

1、儘可能緩存

緩存(Caching)是指存儲有關內容以便將來使用,從而避免獲取或再次計算。

下面任務會很慢:

· 磁盤存取:如果會經常存取一個文件,應該把文件內容保存在RAM中。

· 網絡通信

· 數學計算

· 對象分配[對象池]

· 線程創建[線程池]

2、使用對象池

對象池技術可以避免在程序的生命週期中創建和刪除大量對象,如果知道程序需要同一類型的大量對象,而且對象的生命週期都很短,就可以為這些對象創建一個池(pool)進行緩存。只要代碼中需要一個對象,就可以向對象池申請,用完此對象後,要把它放回池中。對象池只創建一次對象,因此他們的構造函數只調用一次,而不是每次使用時都調用。

3、線程池

線程支持是特定於平臺的。

喜歡我的文章的話,就關注我吧!不要只收藏和轉發哦,每天至少兩篇編程知識給大家,都是本人多年的經驗總結!


分享到:


相關文章: