羅劍鋒的C++實戰筆記-學習筆記(3)

書接上文,三句名言鎮樓。

三句名言鎮樓

  • 任何人都能寫出機器能看懂的代碼,只有優秀的程序員才能寫出人看懂的代碼

  • 兩種寫程序的方式:把代碼寫的非常複雜,以至於"看不出明顯錯誤"。把代碼寫的非常簡單,以至於"明顯看不出錯誤"。

  • 把正確的代碼改快速,要比把快速的代碼改正確,容易得太多。

腳本混合編程

C++開發週期長,排錯/維護成本高,爲充分發揮特點,需要輔助 其他語言,搭建混合系統。以C++爲底層基礎,PythonLua作爲上層建築,搭建高性能、易維護、可擴展的系統。

源碼級性能分析工具 gperftools

它是一個c++工具集,包含CPUProfilerHeapProfiler兩種,前者用來分析CPU,後者用來分析內存。CPUProfiler的原理和perf差不多,默認每秒採樣100次,在你想要做性能分析的函數前後添加如下函數:

  • ProfileStart() : 啓動性能分析,把數據存入指定文件
  • ProfilerRegisterThread(): 允許對線程做性能分析
  • ProfilerStop() : 停止性能分析

使用小技巧:

  1. 進程註冊指定信號,在信號處理函數中調用ProfilerStop來終止進程,隨時生成火焰圖。
  2. RAII配合lambda來抽取性能採樣代碼,實例如下:

auto make_cpu_profiler = [](const string& filename){    // 傳入性能分析文件數據名
    ProfileStart(filename.c_str());
    ProfilerRegisterThread();
    
    return std::shared_ptr<void>(nullptr, [](void*){
        ProfilerStop();     // 在定製的刪除函數中,停止性能分析
    });

// 使用如下方法來開啓測試。
{
auto cp = make_cpu_profiler("xxx.perf");
// 性能分析待測試代碼段


//
}


};


設計模式

學習設計模式,領會內在思想,提升編程功力。

按照設計目的,可將設計模式劃分爲三大類:

  • 創建型:解決對象創建問題
    • 單例模式: 控制只有一個對象實例
    • 工廠模式:批量生產對象實例
      • 工廠方法:對new的封裝,對外屏蔽構造細節
  • 結構型:解決對象組合問題,關注對象靜態聯繫,以靈活方式組合出新的對象,最終對外呈現的是一個複合對象。
    • 使用適配器來轉換接口
    • 使用裝飾模式來增加接口功能
    • 使用外觀來簡化複雜接口。它封裝一組對象,簡化該組對象對外提供的接口。比如 async 例子,它封裝了線程創建、調度細節,使用簡單。
    • 使用代理模式來隱藏對象,不允許外部直接與內部對象通訊。類似於門口的保安,任何人想要訪問內部人員,都必須通過保安來傳達信息。具體爲在原有對象之上增加代理層,客戶只能看到代理對象,不知道原始對象。比如c++中的智能指針,就是原始指針的代理對象。
  • 行爲型:解決對象協作問題
    • 模板方法:父類定義主要操作步驟,規定操作框架,具體細節由子類去完成。
    • 策略方法:使用者擁有一個接口實例,外部注入不同的接口實現,擁有不同功能。
    • 職責鏈模式:將多個對象串成鏈條,讓每個對象都有機會處理請求。

Lambda和智能指針的協同

在線程中,啓動Lambda表達式作爲運行函數,再配合智能指針,要注意使用值捕獲,而不是引用捕獲,否則在線程運行時,智能指針可能會因爲離開作用域而被銷燬,引用失效,導致錯誤。


auto msg_ptr = make_shared<>();

std::thread([msg_ptr](){	//  顯式捕獲外部智能指針

//xxx

}).detach();		// 分離線程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章