一文總結More Effective c++

  1. 仔細區別 pointers 和 references(當你知道你需要指向某個東西,而且絕不會改變指向其他東西,或是當你實現一個操作符而其語法需求無法由 pointers 達成,你就應該選擇 references;任何其他時候,請採用 pointers)
  2. 最好使用 C++ 轉型操作符(static_castconst_castdynamic_castreinterpret_cast
  3. 絕不要以多態(polymorphically)方式處理數組(多態(polymorphism)和指針算術不能混用;數組對象幾乎總是會涉及指針的算術運算,所以數組和多態不要混用)
  4. 非必要不提供 default constructor(避免對象中的字段被無意義地初始化)
  5. 對定製的 “類型轉換函數” 保持警覺(單自變量 constructors 可通過簡易法(explicit 關鍵字)或代理類(proxy classes)來避免編譯器誤用;隱式類型轉換操作符可改爲顯式的 member function 來避免非預期行爲)
  6. 區別 increment/decrement 操作符的前置(prefix)和後置(postfix)形式(前置式累加後取出,返回一個 reference;後置式取出後累加,返回一個 const 對象;處理用戶定製類型時,應該儘可能使用前置式 increment;後置式的實現應以其前置式兄弟爲基礎)
  7. 千萬不要重載 &&||, 操作符(&&|| 的重載會用 “函數調用語義” 取代 “驟死式語義”;, 的重載導致不能保證左側表達式一定比右側表達式更早被評估)
  8. 瞭解各種不同意義的 new 和 delete(new operatoroperator newplacement newoperator new[]delete operatoroperator deletedestructoroperator delete[]
  9. 利用 destructors 避免泄漏資源(在 destructors 釋放資源可以避免異常時的資源泄漏)
  10. 在 constructors 內阻止資源泄漏(由於 C++ 只會析構已構造完成的對象,因此在構造函數可以使用 try...catch 或者 auto_ptr(以及與之相似的 classes) 處理異常時資源泄露問題)
  11. 禁止異常流出 destructors 之外(原因:一、避免 terminate 函數在 exception 傳播過程的棧展開(stack-unwinding)機制種被調用;二、協助確保 destructors 完成其應該完成的所有事情)
  12. 瞭解 “拋出一個 exception” 與 “傳遞一個參數” 或 “調用一個虛函數” 之間的差異(第一,exception objects 總是會被複制(by pointer 除外),如果以 by value 方式捕捉甚至被複制兩次,而傳遞給函數參數的對象則不一定得複製;第二,“被拋出成爲 exceptions” 的對象,其被允許的類型轉換動作比 “被傳遞到函數去” 的對象少;第三,catch 子句以其 “出現於源代碼的順序” 被編譯器檢驗對比,其中第一個匹配成功者便執行,而調用一個虛函數,被選中執行的是那個 “與對象類型最佳吻合” 的函數)
  13. 以 by reference 方式捕獲 exceptions(可避免對象刪除問題、exception objects 的切割問題,可保留捕捉標準 exceptions 的能力,可約束 exception object 需要複製的次數)
  14. 明智運用 exception specifications(exception specifications 對 “函數希望拋出什麼樣的 exceptions” 提供了卓越的說明;也有一些缺點,包括編譯器只對它們做局部性檢驗而很容易不經意地違反,與可能會妨礙更上層的 exception 處理函數處理未預期的 exceptions)
  15. 瞭解異常處理的成本(粗略估計,如果使用 try 語句塊,代碼大約整體膨脹 5%-10%,執行速度亦大約下降這個數;因此請將你對 try 語句塊和 exception specifications 的使用限制於非用不可的地點,並且在真正異常的情況下才拋出 exceptions)
  16. 謹記 80-20 法則(軟件的整體性能幾乎總是由其構成要素(代碼)的一小部分決定的,可使用程序分析器(program profiler)識別出消耗資源的代碼)
  17. 考慮使用 lazy evaluation(緩式評估)(可應用於:Reference Counting(引用計數)來避免非必要的對象複製、區分 operator[] 的讀和寫動作來做不同的事情、Lazy Fetching(緩式取出)來避免非必要的數據庫讀取動作、Lazy Expression Evaluation(表達式緩評估)來避免非必要的數值計算動作)
  18. 分期攤還預期的計算成本(當你必須支持某些運算而其結構幾乎總是被需要,或其結果常常被多次需要的時候,over-eager evaluation(超急評估)可以改善程序效率)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章