罗剑锋的C++实战笔记-学习笔记(3)
书接上文,三句名言镇楼。
三句名言镇楼
-
任何人都能写出机器能看懂的代码,只有优秀的程序员才能写出人看懂的代码
-
两种写程序的方式:把代码写的非常复杂,以至于"看不出明显错误"。把代码写的非常简单,以至于"明显看不出错误"。
-
把正确的代码改快速,要比把快速的代码改正确,容易得太多。
脚本混合编程
C++
开发周期长,排错/维护成本高,为充分发挥特点,需要辅助 其他语言,搭建混合系统。以C++
为底层基础,Python
和Lua
作为上层建筑,搭建高性能、易维护、可扩展的系统。
源码级性能分析工具 gperftools
它是一个c++工具集,包含CPUProfiler
和HeapProfiler
两种,前者用来分析CPU,后者用来分析内存。CPUProfiler
的原理和perf
差不多,默认每秒采样100次,在你想要做性能分析的函数前后添加如下函数:
- ProfileStart() : 启动性能分析,把数据存入指定文件
- ProfilerRegisterThread(): 允许对线程做性能分析
- ProfilerStop() : 停止性能分析
使用小技巧:
- 进程注册指定信号,在信号处理函数中调用
ProfilerStop
来终止进程,随时生成火焰图。 - 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(); // 分离线程