首页 > 编程语言 >罗剑锋的C++实战笔记-学习笔记(3)

罗剑锋的C++实战笔记-学习笔记(3)

时间:2022-11-28 12:46:25浏览次数:56  
标签:分析 对象 性能 接口 C++ 笔记 剑锋 代码 指针

书接上文,三句名言镇楼。

三句名言镇楼

  • 任何人都能写出机器能看懂的代码,只有优秀的程序员才能写出人看懂的代码

  • 两种写程序的方式:把代码写的非常复杂,以至于"看不出明显错误"。把代码写的非常简单,以至于"明显看不出错误"。

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

脚本混合编程

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

标签:分析,对象,性能,接口,C++,笔记,剑锋,代码,指针
From: https://www.cnblogs.com/cherishui/p/16931875.html

相关文章

  • 全链路压测效能10倍提升的压测工具实践笔记【开源】【原创】
    BSF全链路自动化测试工具(autotest),可批量导入样本,自动录制样本,自动样本清洗,自动化压测,自动输出压测报告,让开发和压测人员性能测试的效能提升10倍!!!背......
  • 罗剑锋的C++实战笔记-学习笔记(2)
    书接上文,三句名言镇楼。三句名言镇楼任何人都能写出机器能看懂的代码,只有优秀的程序员才能写出人看懂的代码两种写程序的方式:把代码写的非常复杂,以至于"看不出明显......
  • redisOject 和 底层数据结构对应 学习笔记
    笔记摘抄自https://pdai.tech/md/db/nosql-redis/db-redis-data-type-enc.htmlredisObject查看编码命令setk11objectencodingk1setk2helloobjectencoding......
  • 罗剑锋的C++实战笔记(学习笔记1)
    本系列文章记载学习一门在线课程罗剑锋的C++实战笔记过程中的心得体会,只会记录新增加的知识点,那些心中已熟透的知识点,不会重复记录。c++的主战场在Linux上,现在开发Wi......
  • 驱动开发学习笔记---阻塞和非阻塞IO
    一、阻塞和非阻塞简介当应用程序对设备驱动进行操作的时候,如果不能获取到设备资源,那么阻塞式IO就会将应用程序对应的线程挂起,直到设备资源可以获取为止。对于非阻塞IO......
  • C++中的Pointer member dereference(D-reference) operator
    在C++中,比如我们可以把一个结构体struct的地址赋给一个指针pointer然后使用这个指针去访问这个结构体中的元素时,可以使用pointermemberD-referenceoperator: ->用来......
  • C++ ---获取类成员函数地址
    #include<iostream>classTA{public:inta;voidTA1(){//this->a=5;printf("a=%d\n",a);}voidTA2(){......
  • Django-课程介绍-笔记
    软件框架问题1:什么是软件框架?举个简单的例子,对于一个公司来说,公司中有各个职能部门,每个部门各司其职,通过部门之间的配合来完成工作,这些部门就形成了一个公司的组织架构。从......
  • Django-1.入门-笔记
    本节课是通过Django框架最终完成一个"图书-英雄"信息管理的小例子。目标对使用django框架有一个全面的认识,包括开发流程、基本概念要素,并不针对某个概念知识点详细拆解,后续......
  • Django-1.1搭建环境-笔记
    虚拟环境在开发过程中,当需要使用python的包时可以联网安装sudopip3install包名称使用如上命令,会将包安装到/usr/local/lib/python3.5/dist-packages下。产生的问题如果在......