罗剑锋的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();		// 分离线程

posted @ 2022-11-28 12:25  浩天之家  阅读(130)  评论(0编辑  收藏  举报