随笔分类 - c/c++
c/c++ 语法
摘要:1.概览 线程创建之后,必须使用join待其结束,否则资源无法回收,变成僵尸线程占据资源;当然也可以设置成detach方式,让线程自动回收资源 进程也是一样的操作,子进程并不会自动回收资源,是需要手动回收,这样的目的是因为进程之间往往有父子关系,涉及到流程上的同步 2. 正文 2.1 线程中为什么有
阅读全文
摘要:环形队列可以通过维护count来间接维护tail和head指针的关系,简化程序,避免了直接使用tail和head指针,读写时head与tail回环时的比较处理, 判断队列元素长度时的复杂处理,如下为不基于count而是直接使用head和tail指针比较的环形队列的实现, 逻辑较为复杂 ``` uin
阅读全文
摘要:实现operator=时的常用技巧 class Point{ private: int x; int y; public: Point(const Point& p):x{p.x}, y{p.y}{} }; class Rectangle{ private: Point *point; public
阅读全文
摘要:#2.0 正文 2.1 结构 看set的时候发现其是基于rb_tree实现的,rb_tree主要实现在文件stl_tree.h中,其结构如下所示: _M_t: 类型为rb_tree, std::set中放的红黑树 _M_impl: 类型为_Rb_tree_impl,红黑树的具体实现,存放着头节点_M
阅读全文
摘要:什么是协程 协程是一种函数对象,可以设置锚点做暂停,然后再该锚点恢复继续运行,我觉得这是最合适的定义,用户态线程,轻量级线程,可中断恢复的函数,这些都不够精确,先来认识一个boost 1.75的一个例子 #include <iostream> #include <boost/coroutine2/a
阅读全文
摘要:前言 本文使用的asio1.76.0从github获取,老版本中有一个很重要的结构叫做io_service,新版本中改成了io_context,下面主要通过c++14下的一个异步的例子分析boost.asio的线程模型,其代码结构比较复杂,时间有限不能分析的很详细,只是做大体结构分析 正文 asio
阅读全文
摘要:创建和运行分析 #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <queue> #include "co_routine.h" using namespace std; struct stTask_t { int
阅读全文
摘要:概览 最近看到陈硕老师的muduo的7.6实现protobuf编解码器与消息分发器,觉得消息分发器这里写的确实很妙,简述一下背景,做业务的时候我们常会在tcp上制定一个消息格式,通过这些消息进行通讯,消息除了长度,类型,消息体为了最大压缩会使用pb,然后陈老师制作一个如下的消息格式样例 +-+-+-
阅读全文
摘要:2.正文 2.1 左值引用(&)与右值引用(&&) 在c++11中提出了右值引用,作用是为了和左值引用区分开来,其作用是: 右值引用限制了其只能接收右值,可以利用这个特性从而提供重载,这是右值引用有且唯一的特性,限制了接收参数必为右值, 这点常用在move construct中,告诉别人这是一个即将
阅读全文
摘要:#include <iostream> #include <utility> #include <boost/type_index.hpp> using namespace std; using boost::typeindex::type_id_with_cvr; template<typenam
阅读全文
摘要:概 c++的atomic使用总会配合各种各样的memory order进行使用,memory order控制了执行结果在多核中的可见顺序,,这个可见顺序与代码序不一定一致(第一句代码执行完成的结果不一定比第二句早提交到内存),其一是进行汇编的进行了指令优化重排,其二是cpu实际执行时乱序执行以及部分
阅读全文
摘要:1.概览 1.1 函数名中的箭头,用来表明函数的return type,其使用在函数的返回类型需要通过模板参数进行推导,使用在decltype()和declval()不方便的场景 2.正文 c++ 中提供了如下的方式,定义一个函数以及返回值 return-type identifier ( argu
阅读全文
摘要:1.概览 1.虚函数:根据基类指针指向的对象的不同,调用不同类的方法 2.纯虚函数用来提供接口规范,而不必实现一个纯虚函数提出的方便,只是一个声明而不是定义,所以没法创建一个抽象类 4.虚函数是通过在类内存放虚函数指针,其指向虚函数表来实现的 5.子类虚函数表的初始化是拷贝父类虚函数表,子类实现的同
阅读全文
摘要:概览 1.base64和md5都可以通过apr util库完成 2.base64编码通过apr_base64_encode()实现 3.md5编码通过apr_md5()实现 正文 1.安装apr库 2.base64编码 "apr base64官方文档" 编译 ref "apr base64官方文档"
阅读全文
摘要:序 1. gcc/g++ 编译器中提供了对缓冲区溢出的栈保护选项 fstack protector 2. 栈溢出的时候,core dump 反馈的行数是不准确的,首先通过反汇编,确认是否去执行__stack_chk_fail了,确定栈溢出了,然后使用log 去跟踪到底是哪里发生了问题 3. gcc/
阅读全文
摘要:``` #include /* struct timeval { __time_t tv_sec; Seconds. 秒位部分 __suseconds_t tv_usec; Microseconds. 微秒位部分 }; */ void fn(){ struct timeval now; gettimeofday(&now, NULL); //获取从1970年1月1日到现在的时间 cout<<"当前
阅读全文
摘要:1.前言 本文mark了vector的一些接口,介绍了vector中的对内存和对象的管理详解请见 "cppreference vector" 1.vector内部管理着一块内存,压入对象的时候,会使用这块内部的内存使用placement new去进行对象的生成,而释放对象的时候,显式的去调用析构函数
阅读全文
摘要:前言 从网上看到的另一句话,webrtc中的信号槽像是变种的观察者模式,当有信号发送的时候,信号发送者通过遍历自己的所有connect的信号槽,然后执行他们的回调;起初会有为什么需要信号槽 信号槽与普通的函数回调有什么区别的疑问, 个人认为信号槽是一种面向对象的回调,当回调涉及到对象,需要考虑到执行
阅读全文
摘要:前文 下文中的出现的"当前域"为"当前作用域"的简写 namepsace在c++中是用来避免不同模块下相同名字冲突的一种关键字,本文粗略的介绍了一下namespace的使用以及需要注意的地方: 1.可通过显示指定namespace,或使用using引入符号的方式, 或使用using namepsac
阅读全文