C++
文章平均质量分 82
若_思
当时代抛弃你的时候,连再见也不会说一声
展开
-
Mac m1上使用docker搭建C++开发调试环境
因为mac上虚拟机都不太好用,有些还收费,故使用docker来搭建虚拟机。况且我的Mac是m1芯片,用的是arm架构,虚拟机更是少。原创 2022-08-21 21:33:27 · 1927 阅读 · 0 评论 -
C语言实现协程----初探
协程定义协程,从编程的角度看来,可以理解为用户自己能控制和调度的线程,可以理解为用户级别的线程。一个线程可以有多个协程,一个进程也可以有多个协程。协程实现协程的实现有多种方式setjmp和longjmpsigsetjmp和siglongjmpucontext函数族本次采用ucontext实现,思路是:在进行函数跳转前,将获取当前调用者的上下文,并在当前调用者的上下文的基础上进行修改,制作新的函数堆栈,然后切换到函数的上下文。当函数执行结束,切换到调用者的上下文,让调用者继续执行协程调度。原创 2022-04-29 17:30:01 · 1638 阅读 · 0 评论 -
C++ 模仿实现Java SpringMVC框架中Controller
背景之前有很长一段时间学过Java的SpringMVC框架,被它的简洁优雅所感动。后面从事了C++开发,遇到相识的开发场景总会联想到Java的框架上,本文就分享一下如何用C++模仿实现SpringMVC中Controller的功能效果。分析与实现我们先来看看SpringMVC是怎么来写Controller的@RestControllerpublic class HelloWorldController { @RequestMapping("/hello") public Strin原创 2021-02-22 00:47:44 · 2531 阅读 · 1 评论 -
C++ 揭开JSON序列化的奥秘----从协议解析到普通对象JSON序列化底层原理的解析与实现
目录Ⅰ:格式解析篇一:JSON格式解析初步二:Token解析三:JsonValue的组装四、JSON解析全部代码五:测试Ⅱ:普通对象JSON序列化篇一:说明二:准备工作三:详细代码四:测试Ⅲ:总结Ⅰ:格式解析篇一:JSON格式解析初步我们都知道JSON格式是怎么样的,在这里我们不详细说明JSON的格式,如果需要查看更详细的介绍,可以去JSON中国网站查询。在这里,我们只介绍JSON格式的解析过程。那么,要解析JSON格式,我们到底需要怎么做呢?本文主要分两步:找有效字符:抽出JSON字符串中的原创 2021-02-19 22:00:58 · 1418 阅读 · 2 评论 -
[C++]记一次由placement new引发内存泄露的惨痛教训
背景由于项目中用到一个类,那个类的构造方式有点麻烦,而且它的构造函数有很多个,每一个构造函数都或多或少与其他的构造函数有点相似,只是少了一些参数而已,于是想到可以在另一个构造函数中,利用placement new在this指针的地方来构造,本来想着因为它是在对象本身的地址的地方,不会有内存泄漏出现,但是问题还是出现了。placement newnew操作符相信我们大家都很熟悉,在此就不介绍了,而placement new相信大家用得都比较少。一般来说,我们new出来的对象一般都是放在进程内存划分中的自原创 2021-02-04 13:05:15 · 1507 阅读 · 2 评论 -
C++使用有限状态自动机编程解析HTTP协议
目录Http请求报文格式简介请求方法协议请求头解析HTTP协议的有限状态自动机编码运行测试小结Http请求报文格式简介对于Http请求报文,想必大家都不陌生。Http请求报文主要由4部分组成,分别为请求行、请求头、空行、请求体。请求报文格式如下图所示:请求方法请求方法包括GET、HEAD、PUT、POST、TRACE、OPTIONS、DELETE等,详见官方文档。协议协议版本的格式为:HTTP/主版本号.次版本号,常用的有HTTP/1.0和HTTP/1.1。请求头请求头为一系列键值对形式原创 2021-01-07 17:14:14 · 2311 阅读 · 0 评论 -
Linux下基于信号和共享内存实现进程池
目录介绍实现测试介绍为了实现进程池,我们主要需要考虑以下几个点1:如何进行进程间通信2:进程间如何共享数据关于进程间通信,有很多种方式,比如说管道,信号,socket,共享内存,消息队列等,本文主要基于信号和共享内存来实现进程间通信。对应linux的函数原型为:int kill(pid_t pid, int sig); //发送信号int sigaction(int signum, const struct sigaction *act, struct sigaction *oldac原创 2020-12-03 11:51:22 · 234 阅读 · 0 评论 -
C++11 mysql数据库从原生api的封装到ORM库的实现 [高仿通用mapper接口]
目录一:mysql原生api的封装和连接池的实现二:ORM的实现1:封装初衷2:封装思路3:测试结果三:总结四:代码仓库1:github2:码云一:mysql原生api的封装和连接池的实现ORM封装的第一步,需要对mysql原生api进行封装,让之后的调用更加便捷。同时,为了能复用连接,提高获取连接的效率,还做了个连接池。具体封装和实现可查看c++ mysql数据库操作api接口的封装c++ 基于mysql原生api数据库连接池的实现二:ORM的实现1:封装初衷做过Java web服务器开原创 2020-05-23 15:49:05 · 2412 阅读 · 0 评论 -
C++11 设计模式--模板方法模拟实现Java Spring AOP
目录一:背景二:具体实现三:应用一:背景当进行数据库更新的时候,有以下场景需要处理:1:业务方法执行开始的时候,需要拿到数据库连接,然后开启事务。2:若业务在某个环节抛异常,为了数据库数据的而一致性,需要回滚事务。3:若业务执行无异常,需要提交事务。4:最后无论业务成功或者失败,都需要释放资源。对于这个业务场景,Java Spring框架的AOP可以很方便的对业务方法做拦截处理。Java动态代理也能很方便的实现该需求。而C++没有相对应的特性。本文模仿Java AOP,基于设计模式中的模板方法,原创 2020-05-13 14:41:30 · 791 阅读 · 2 评论 -
C++ SQL语句构建器的实现[与mybatis3使用方式一致]
目录一:简介二:实现三:使用示例一:简介1:有时候我们需要动态生成SQL语句,我们当然可以在代码中直接写出那条SQL语句,然而令人头疼的是对于SQL语句的各种换行,格式化,逗号,AND和OR的处理,都是很容易出错的,对此,需要有一个更加智能的方式方便我们编写SQL语句。2:MyBatis提供了一个好用的工具类帮助我们解决这个问题,其文档地址为:Mybatis SQL 语句构建器本文仿造Mybatis,模仿实现了一个基于C++语言版的SQL语句构建器。二:实现首先需要一个拼接SQL语句的类S原创 2020-05-10 15:49:40 · 1584 阅读 · 1 评论 -
wsl环境下搭建QT12.6开发环境[QT无界面命令行安装]
unbuntu下qt12.6命令行安装原创 2020-05-09 21:09:03 · 1171 阅读 · 1 评论 -
C++ 基于mysql原生api数据库连接池的实现
目录一:思路二:实现三:后续一:思路1:连接池中至少保存有最小连接数的数据库连接。当连接数达到最大值的时候,无法再创建新的连接,如果需要获取一个连接,则需要等待相对应的时间。2:连接池中数据库连接接口基于上篇文章封装的Connection的实现,主要是实现对mysql原生api的封装。文章链接:c++ mysql数据库操作api接口的封装二:实现首先连接池是单例的,所以封装下单例模式。Singleton.hpp/** * 单例模式的封装类 * @tparam T */templ原创 2020-05-09 12:06:25 · 690 阅读 · 0 评论 -
C++ mysql数据库操作api接口的封装
目录一:关键接口说明二:具体实现三:接口测试四:后续一:关键接口说明一般预处理流程都是,连接数据库–>预处理–>绑定查询参数–>执行查询–>获取查询结果。故api封装之后有如下几个关键的接口:1:bool connect(); //连接数据库,初始化数据库连接等2:bool prepare(const std::string &query);//预处理3:template<typename T> void bindValue(int pos, cons原创 2020-05-06 12:25:13 · 3713 阅读 · 1 评论 -
C++线程池的简单实现 [Java风格]
目录1:简介2:C++版本的BlockingQueue3:C++版本的Runnable接口3:ThreadPoolExecutor4:测试代码1:简介本文基于C++11,实现的线程池功能实现相当于java中核心数线程为size,最大线程数为size,任务队列为无界队列的ThreadPoolExecutor线程池,且简化了,直接一次性生产出size数量的线程。凡是继承了Runnable接口的任务都可以提交到该线程池中。任务队列也模仿Java的BlockingQueue阻塞队列。2:C++版本的Block原创 2020-04-16 00:07:55 · 561 阅读 · 0 评论