
编程语言:C++
文章平均质量分 78
工作中用到C++
在此记录遇到的问题,可以精进的方面
z_stand
远离颠倒梦想,究竟涅槃
展开
-
关于 智能指针 的线程安全问题
智能指针是非线程安全的,多线程下修改共享的智能指针的时候需要有同步机制原创 2021-09-04 09:57:55 · 4859 阅读 · 3 评论 -
关于std::string 在 并发场景下 __grow_by_and_replace free was not allocated 的异常问题
并发场景下 std::string 动态扩容引入的内存泄漏问题原创 2021-09-02 22:41:17 · 1172 阅读 · 0 评论 -
手把手教你 用C++实现一个 可持久化 的http_server
一个 支持持久化的httpserver 实现原创 2021-06-15 13:59:48 · 1520 阅读 · 0 评论 -
C++ 通过模版工厂实现 简单反射机制
通过模版工厂 实现 C++的反射机制原创 2021-06-11 02:23:58 · 2016 阅读 · 3 评论 -
C++ std::function<void(int)> 和 std::function<void()> 作为函数参数的注意事项
std::function 使用过程中的一些记录原创 2021-06-08 22:41:21 · 10084 阅读 · 2 评论 -
Jsoncpp 在C++开发中的一些使用记录
1. Json 将字段解析为对应数据类型;2. 从 std::map 生成Json 数据类型3. Json数据类型转化为string 数据类型3. 将一个未知的Json字符串并解析为其他数据类型原创 2021-05-31 18:55:59 · 769 阅读 · 0 评论 -
Rocksdb 的compaction_filter和table_properties_collector 用法 及 其底层实现
C++多态 + 工厂模式的灵活应用,极简的抽象来增强引擎的可扩展性原创 2021-03-30 22:58:00 · 2403 阅读 · 2 评论 -
Clion 远程开发 配置
Clion 远端开发配置方式,节省看官时间。原创 2021-02-27 15:31:18 · 5806 阅读 · 0 评论 -
Rocksdb 的优秀代码(三)-- 工业级 线程池实现分享
Rocksdb compaction/flush 线程池实现分享,且个人已实现该线程池基本功能,欢迎试用。原创 2021-02-27 00:09:57 · 2547 阅读 · 0 评论 -
C++ 从双重检查锁定问题 到 内存屏障的一些思考
文章目录1. 问题描述2. DCLP 的问题 和 指令执行顺序2.1 Volatile 关键字2.2 C++11 的内存模型3. C++11内存模型 解决DCLP问题3.1 内存屏障和获得、释放语义3.2 atomic 的完整介绍3.2.1 原子操作的三种类型3.2.2 atomic 内存序3.2.3 atomic 成员函数1. 问题描述单例模式 是我们日常编码过程中比较常用的一种设计模式,用来对一个抽象进行限定,表示该类在当前程序生命周期内仅能创建一次,被整个进程空间共享。比如 FPGA处理单元在我原创 2020-10-08 11:51:55 · 1048 阅读 · 1 评论 -
设计模式 之美 -- 策略模式
策略模式作为行为型设计模式中的一种,主要封装相同功能的不同实现算法,用于在用户程序内部灵活切换。对用户来说能够快速替换对应的算法,能够让算法的实现独立于使用的用户。基本的UML类图如下:用户使用Stratey的实例能够快速得在不同的Cache算法之间灵活切换(直接使用对应的Cache实例来设置到Strategy之中即可。),而不用关注具体的算法实现。#include <iostream>#include <string>using namespace std;cla原创 2020-09-30 19:15:27 · 322 阅读 · 0 评论 -
Mac 上使用 Clion 阅读C++源码的一些操作
一直在尝试一些写代码方便,阅读代码也很方便的工具,因为使用的是Mac,所以sourceInsight就没办法用了。从vscode – sublime – clion想要可配置性强一点,软件轻一点,也能提供足够的便捷操作,不论是写代码还是快速索引源码,都希望在检索上面节省足够的时间。vscode 和 sublime 都能够提供便捷的写代码插件,但是在阅读源码上面实在是太慢了。想要查找某个类被引用的地方,源码量大的话需要好几分钟,这谁能扛得住。想要快一点,配置了vim的ctags,速度是快了,但是可视化信原创 2020-08-08 13:50:50 · 3854 阅读 · 3 评论 -
C++ lamda表达式 和 函数模版用法
前言本节将对函数对象,匿名函数对象(lamda表达式) 以及 匿名函数对象和 函数模版结合对一些用法 做个笔记。同时,分析以下lamda表达式相比于传统函数对象的优劣。关键是看一些 rocksdb类似的经典C++项目,老是有些细节get不到,导致最终理解的设计思想和实际的实现有差异。所以将这些高阶语法 再系统过一遍,加深对源码的理解。函数对象函数对象在C++98的时候已经比较成熟了,先看一段代码struct adder { adder(int n) : n_(n) {} int原创 2020-08-02 16:52:45 · 1381 阅读 · 1 评论 -
google gflags的参数解析,便捷实用
命令行参数解析,一直是我们后段开发人员需要经常使用的一个功能,用来从终端解析接口的输入 ,并做出对应的处理。这里为使用C++/python的开发人员推荐一个便捷的命令行解析接口集 gflags。我们之前使用C的getopt/getopt_long 函数需要自己使用其接口并编写大量的周边代码达到解析参数的目的,如果转到C++还使用上面的函数,代码会过于冗余。那么gflags就很好的解决了这个问题,我们不需要再数着冒号 "a????️cd:"添加参数了,不需要为每个传入的参数做类型转化。接下来的gflags原创 2020-06-28 22:45:41 · 751 阅读 · 0 评论 -
C++ STL: 超详细 容器 deque 以及 适配器queue 和 stack 源码分析
文章目录前言deque 实现deque类_Deque_iterator 类deque 的元素插入 insert函数deque如何模拟空间连续queue 实现stack 的实现前言C++容器中 deque是一个非常有趣的容器结构,我们知道deque本身是一个支持双向扩容的结构,对外表现出连续的存储方式。本节将从它的内部实现抽丝剥茧,看看STL 团队的deque以及通过deque实现的queue和stack适配器的有趣实现。关于deque 支持的基本接口如下:push_back()push_fr原创 2020-06-25 22:45:34 · 1126 阅读 · 0 评论 -
C++ STL: 容器vector源码分析
文章目录前言vector的核心接口vector push_back实现vector 的 Allocatorvector 的 push_back总结前言vector 是我们C++STL中经常使用的一个容器,提供容量可以动态增长,并且随机访问内部元素的数据存储功能。这个容器我们最常使用,所以也是最为熟悉的一种容器。通过它来看STL的源码设计,以及STL六大组件之间的搭配使用,可以让我们对C++这种语言,对优秀的编码设计,对有趣的数据结构和算法都能有深刻的理解和认识。STL六大组件关系如下:其中容器原创 2020-06-21 01:43:09 · 1404 阅读 · 0 评论 -
C++ STL: lower_bound 和 upper_bound
接口声明以下有两个不同的版本lower_boundtemplate <class ForwardIterator, class T> ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last, const T& val);template <class ForwardIterator, class T, clas原创 2020-06-18 20:46:37 · 417 阅读 · 0 评论 -
C++ STL: 分配器allocators 源码分析
STL 基本的六大组件作用以及功能如下:可以看到allocator是数据存储组件container的幕后支持者,负责为其数据存储分配对应的存储空间。operator::new在详细介绍alloctor之前,先描述一下new运算符,我们使用C++ new一个对象的时候就是调用底层operator::new运算符,实现如下:void * operator new(std::size_t size){ ++allocations; void * retval = malloc(size原创 2020-06-15 09:21:23 · 726 阅读 · 0 评论 -
C++ STL: 基本六大部件概览 及 各个容器使用方式和底层实现概览
文章目录STL六大部件容器的使用Arrayvectorlistdequemutisetmultimapunordered_multiset/set使用一个东西,却不明白它的道理,不高明。STL六大部件容器 Containers 用来存放数据分配器 Allocators 为容器内大数据分配存储空间算法 Algorithms 计算数据迭代器 Iterators 访问数据大方式(算法使用其访问容器内大数据)适配器 Adapters仿函数 Functors 类似于函数的功能六大组件之间原创 2020-06-12 00:58:41 · 833 阅读 · 0 评论 -
C++ 中emplace_back和push_back差异
前言最近看rocskdb源码,发现了大量的设计模式和C++高级特性,特此补充一下,巩固基础。问题描述其中关于动态数组的元素添加,代码中基本将push_back抛弃掉了,全部替换为emplace_back进行元素的添加。看了一下官网描述:原来的push_back 一个右值元素的时候 过程分为如下几步:使用右值数据类型的构造函数 构造一个临时对象调用拷贝构造函数将临时对象放入 容器中释放临时对象可以看到以上的三个步骤,临时对象的资源就没有用到,而且还多了一次拷贝构造的过程,效率大大降低后原创 2020-06-02 22:33:14 · 1104 阅读 · 0 评论 -
C++ 泛型编程 -- 函数模版
文章目录定义声明调用方式函数模版的重载函数模版的特点工作中一个同事写了测试demo,想要自己尝试使用发现调用老出错,请教的时候发现是函数模版,有自己的调用方式,并且发现核心代码中大量的函数模版和类模版。特此做一个函数模版相关的总结,为今后更加熟练的开发做好铺垫。定义C++中,存在泛型编程的概念:即不考虑具体数据类型的编程方式函数模板是一种特殊的函数,可以使用不同的类型进行调用,对于功能相同的函数,不需要重复编写代码,并且函数模板与普通函数看起来很类似,区别就是类型可以被参数化声明函数模版的声原创 2020-05-14 01:46:38 · 365 阅读 · 0 评论 -
栈 -- 顺序栈、链式栈的实现 及其应用(函数栈,表达式求值,括号匹配)
我们使用浏览器的时候经常会用到前进、后退功能依次访问完一串页面 a – b – c之后点击后退功能,则能够依次看到c – b – a的页面。但是这个过程中,如果后退到了页面b,点击了新的页面d,则再点击前进无法回到页面c。这个过程的实现就是我们 “栈”数据在其中起作用了。实现栈的基本实现有如下两种:顺序栈 – 基于数组的实现链式栈 – 基于链表的实现顺序栈实现#include <iostream>#include <assert.h>using nam原创 2020-05-10 17:41:16 · 692 阅读 · 0 评论 -
设计模式 之美 -- 代理模式
文章目录1. 解决问题2. 应用场景1. 业务系统的非功能性开发2. 代理模式在RPC、缓存中的应用3. 实现C++实现C语言实现1. 解决问题客户端和目标对象之间需要进行交互,此时客户端类和目标对象类相关操作之间的逻辑如果交合在一起,会导致客户端和目标对象模块耦合度升高,后期扩展客户端的功能时,则需要修改两者的源代码。这样的架构设计在系统更加庞大(网络通信链路庞杂,功能增删频繁)的场景下,...原创 2020-04-26 21:41:20 · 266 阅读 · 0 评论 -
设计模式 之美 -- 原型模式
文章目录1. 解决问题2. 应用场景3. 实现方式C++实现C语言实现4. 缺点5. 和其他三种创建模式的对比(单例,工厂,建造者)1. 解决问题如果对象的创建成本较大,而同一个类的不同对象之间的差别不大(大部分字段相同),在这种情况下,我们可以利用已有对象(原型)进行赋值(拷贝)的方式,创建新的对象,从而达到节省对象创建时间的目的。2. 应用场景需要在运行过程中,动态的拷贝一份对象需...原创 2020-04-24 21:18:09 · 272 阅读 · 0 评论 -
C++ 智能指针(unique_ptr / shared_ptr)代码实现
文章目录unique_ptr 智能指针的实现shared_ptr 智能指针的实现指针类型转换unique_ptr 智能指针的实现一个对象只能被单个unique_ptr 所拥有。#include <iostream>using namespace std;/*增加模板类型,保证智能指针的类型是由传入的类型决定的*/template <typename T>...原创 2020-04-23 22:22:56 · 634 阅读 · 0 评论 -
设计模式 之美 -- 建造者模式
文章目录1. 解决问题2. 应用场景3. 实现C语言实现C++实现4. 缺点1. 解决问题描述如下场景:类的数据成员很多(8个以上),当我们进行初始化的时候放在初始化列表中,影响类的可读性,同时校验初始化参数列表是否有效的逻辑也无处放置假如初始化列表中的参数有一定的依赖关系,比如数据成员max 一定比 数据成员min 小才行,这样的依赖关系设置逻辑无处安放(需要在类实例化的时候就要完成依...原创 2020-04-22 23:10:59 · 257 阅读 · 0 评论 -
编程模式 之美 -- 抽象工厂模式
文章目录1. 解决问题2. 应用场景3. 实现如下:C++实现C语言实现4. 缺点1. 解决问题在工厂方法模式中,我们卖衣服。此时我们为每一种衣服创建不同的工厂,帽子有一个工厂专门创建,裤子有一个工厂专门创建,T恤有一个工厂专门创建。这样的方式保证了代码设计的开闭原则(对扩展开发,对修改关闭),解决了简单工厂模式中暴露的问题。但是又凸显了新的问题,假如现在优衣库这个大工厂 里面需要生产不同的...原创 2020-04-21 23:07:50 · 393 阅读 · 0 评论 -
设计模式 之美 -- 工厂方法模式
文章目录1. 解决问题2. 应用场景3. 实现如下C++实现C语言实现4. 缺点1. 解决问题在简单工厂模式中,我们使用卖衣服进行举例,同一种工厂可以卖很多不同种类的衣服,工厂只是将衣服的生产过程进行了封装。当我们增加衣服种类的时候,在简单工厂模式中需要对修改工厂的代码,破坏了类的开闭原则(对扩展开发, 对修改关闭),同时增加测试成本。此时为了避免这种问题的出现,我们推出工厂方法模式,为每...原创 2020-04-20 23:01:30 · 308 阅读 · 0 评论 -
设计模式 之美 -- 简单工厂模式
文章目录1. 解决问题2. 应用场景3. 实现C++实现:C语言实现4. 缺点1. 解决问题举例如下:我们实现一个卖衣服的功能,衣服的种类有很多:帽子,裤子,T恤。。。 每卖一种衣服,我们都要进行一次实例化,通过new/malloc申请空间,会有如下两种问题:new /malloc之后往往需要跟随一堆异常处理代码,当衣服种类越来越多,我们的代码会显得异常臃肿。当新的服务员来到商店,他想...原创 2020-04-16 23:10:32 · 319 阅读 · 0 评论 -
设计模式 之美 -- 单例模式
为什么要使用单例?一个类只允许创建一个对象或者实例。背景简介:使用多线程并发访问同一个类,为了保证类的线程安全,可以有两种方法:将该类定义为单例模式,即该类仅允许创建一个实例为该类的成员函数添加类级别的锁举例:一个向指定文件写入日志的类,为了保证该类并发调用时写入文件的日志不会覆盖,需执行以上操作。单例模式的几种经典的实现方式:饿汉式在类的加载期间,将静态实例初始化好...原创 2020-04-13 22:42:36 · 356 阅读 · 0 评论 -
设计模式 之美 -- 面向对象(C/C++分别实现)
前言为了保证代码的可复用性、可扩展性、可维护性,我们提出了面向对象的思想。面向对象的核心特性有以下几个封装特性信息隐藏或者数据访问保护。类通过暴露有限的访问接口,授权外部仅能通过类提供的方式来访问内部信息或者数据。封装用来提升代码的可扩展性、可维护性继承特性继承是用来表示类之间的 is-a 关系,分为两种模式:单继承和多继承。单继承表示一个子类只继承一个父类,多继承表示一个子类可以...原创 2020-04-11 09:33:23 · 388 阅读 · 0 评论 -
C++ 互斥锁和条件变量实现读写锁
最近的诸多面试经历确实让自己发现内功还不够,还需要持续的学习精进。实现如下:class RWLock{ private: int state; mutex mu; condition_variable cond; public: RWLock():state(0){} void rlock(){ mu.lock(); while(state < 0){ ...原创 2020-02-25 18:35:19 · 1305 阅读 · 0 评论 -
Linux多线程管理: 多线程编程
多线程编程mind-Mapping保存有一下导图的xmind文件,可直接获取互斥变量互斥对象ptrhead相关接口条件变量future异步访问类async类promise类package_task类...原创 2020-01-16 21:13:36 · 350 阅读 · 0 评论 -
C++ 技能树(持续更新)
相关xmind的原始文件已上传至mind-Mapping github,如有需要可自行下载,欢迎批评指正关于分布式存储的整体技能的学习历程 可以参考分布式存储技能图谱,仅为个人的技能学习框架...原创 2020-01-05 10:56:44 · 2601 阅读 · 0 评论 -
贪心:Jump Game 跳跃游戏
一个数组存储了非负整型数据,数组中的第i个元素a[i],代表了可以从数组第i个 位置最多向前跳跃a[i]步;已知数组各元素的情况下,求是否可以从数组的第0个位置跳跃到数组的最后一个元素的位置,返回最少跳跃的次数例如:nums = [2, 3, 1, 1, 4] ,可以从nums[0] = 2 跳跃至 nums[4] = 4;nums = [3, 2, 1, 0, 4] ,不可以从nums[0...原创 2019-11-06 00:22:50 · 482 阅读 · 0 评论 -
贪心:jump 游戏(获取最少跳跃的次数以及跳跃路径)
一个数组存储了非负整型数据,数组中的第i个元素a[i],代表了可以从数组第i个 位置最多向前跳跃a[i]步;已知数组各元素的情况下,求是否可以从数组的第0个位置跳跃到数组的最后一个元素的位置,返回最少跳跃的次数以及跳跃过程的路径(以数组下标标识)例如:nums = [2, 3, 1, 1, 4] ,可以从nums[0] = 2 跳跃至 nums[4] = 4; 最少跳跃次数为2,跳跃路径为[0...原创 2019-11-06 13:30:15 · 901 阅读 · 0 评论 -
C++的 STL堆 实现获取中位数
前言堆数据结构 使用的是优先级队列实现,创建堆的时候需要指定堆中元素的排列方式,即最大堆或者最小堆最大堆即 堆顶元素为堆中最大的元素最小堆即 堆顶元素为堆中最小堆元素如下为一个最大堆中位数:一组数排序后,如果元素个数如下奇数个数n:(int) n/2 的数偶数个数n: (int) n/2 和(int) n/2 +1的平均数同样此时想要获取一组数列中的中位数,且同样使用时间复...原创 2019-11-03 14:11:05 · 1937 阅读 · 0 评论 -
C++的STL 堆 实现获取数组堆第K大的数
前言堆数据结构 使用的是优先级队列实现,创建堆的时候需要指定堆中元素的排列方式,即最大堆或者最小堆最大堆即 堆顶元素为堆中最大的元素最小堆即 堆顶元素为堆中最小堆元素如下为一个最大堆回到文章标题,获取一个数组中第K大的数,要求时间复杂度是O(n),即一次遍历即可获取到该值。所以普通的先排序,再获取第k个数值的方式显然不满足要求,排序最快的快速排序也需要O(log2 n)这里就是我...原创 2019-11-03 13:41:06 · 1068 阅读 · 0 评论 -
C++的STL 栈 实现四则运算
使用栈实现四则运算,支持+,-,*,/,(,)输入为字符串,输出为计算好的数值,如不符合四则运算的规定,则异常退出这个实现借用了栈以及字符处理状态机的思想:维护两个栈:一个用于数值,另一个用于存放计算符号字符状态机用于遍历输入的字符串过程中进行对应数值处理和计算符号处理的状态转换在第一个思想中:符号栈中存在优先级,即*和/的优先级高于+和-,同时括号的优先级高于*和/,所以符号栈的入...原创 2019-11-02 20:21:17 · 811 阅读 · 0 评论 -
C++的STL 栈实现 判断栈的出栈顺序是否合理
有这样的题目:已知从1至n的数字序列,按顺序入栈,每个数字入栈后即可出栈, 也可在栈中停留,等待后面的数字入栈出栈后,该数字再出栈,求该数字序列的出栈序列是否合法?类似如下:已知栈的出栈序列为:3 2 5 4 1,判断该栈的出栈序列是否合法过程如下:第一次1-5顺序入栈:1,2,3第二次 3 出栈:1,2第三次 2 出栈:2第四次 4,5 入栈:1,4,5第五次 5 出栈:1,4...原创 2019-11-02 19:16:27 · 852 阅读 · 0 评论