自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(50)
  • 资源 (5)
  • 收藏
  • 关注

原创 从unique_ptr看空基类优化

本文通过从unique_ptr出发来看其在不同形式的删除器下的大小,从而得到unique_ptr中使用tuple来实现,进一步看tuple实现,得出对于其保存的数据来说,有成员存储和基类继承两种形式,而基类继承的形式如果是空基类的话又会对其进行优化。我们学习了unique_ptr的部分源码,tuple的部分源码,对于数据存储我们也学习到可以使用基类继承的形式。

2024-04-11 21:46:50 661

翻译 C++的算法和KISS原则

优先使用算法的准则依然有效:无论什么时候,如果你看到了for循环,确认下是不是可以被算法替代或者ranges,然后这个准则更像一个指导方针:不要盲目跟随,而是要有意识地做出选择,选择那些更简单、更易读的方法,并注意其他替代方法,比如迭代器范围构造函数。

2024-03-29 07:46:36 19

原创 C++设计模式之访问者模式

访问者模式是可以将数据结构体和该结构体使用的算法分离的一种设计模式,属于行为型模式,在一些算法抽象情况下可能会用到。访问者模式可以做到在不修改一个类的情况下,向该类添加一些操作。当你在修改源码不太可能时,针对于类的操作,可以单独提供访问者类来实现。举例来说,比如说序列化每个类都知道如何序列化自己需要序列化到磁盘,缓冲区,socket等等目的地(destination)一个可选的方案是,写一个很大的函数,用来将目的地和类组合或者使用访问者模式,将类和序列化操作分离开。

2024-03-20 07:54:04 1028

原创 constexpr与函数参数转发

本篇文章就是和大家探讨下constexpr的参数传递的问题,可以使用非类型模板参数,宏定义,lambda表达式做到。

2024-02-26 12:12:33 732

原创 linux0.11源码看信号的处理流程

本文我们从例子出发讲述了信号的处理整体流程,虽然内核的代码已经比较老了,但是总体的流程不变。我们从信号发射,信号捕获,信号处理等方面分析其流程。

2024-01-25 07:19:11 1041

原创 C++用宏实现类成员反射

这里我们使用宏来实现了结构体(或类)成员的反射,包括成员的个数,成员的指针,成员的类型。有了这些我们就可以做一些基本的操作了,比如说一些序列化结构体等等。同时我们还展示了TypeList及相关的简单操作。当然你如果需要的话,也可以将TypeList操作丰富起来。

2024-01-08 07:08:14 1030

原创 C++ 如何设计好用的API

好用的c++ api

2023-12-13 06:41:02 157

原创 C++现代模板元编程

现代模板元编程

2023-12-05 07:20:04 100

原创 诡异的bug之dlopen

本文我们从例子中看出来dlopen的解析符号的位置和顺序会影响程序的正确性。dlopen等函数不仅仅是依赖于运行时库还依赖操作系统,不同操作系统上表现可能不一样尽量不要多个不同的ELF文件含有相同的符号,比如这个例子中我们就可以让单独一个so库对factory及factory_register进行封装,大家都使用这个库保证符号的单一性。排查问题时可以使用readelf,nm,pmap等指令查看elf文件中的符号,以及运行时符号所在的位置等。

2023-11-15 07:06:27 748

原创 诡异的bug之cmake

本文展示了一下工作中遇到的bug以及bug整体的排查流程,和一些相关的手段,也是比较常用的,大家也可以记录到自己的小本本上。

2023-10-17 09:15:55 129

原创 探索一种C++中构造对象的方式

本文展示了一种对象构造的实现,使用AnyType的思路实现,中间也处理很多的问题。对于无需绑定(或部分绑定)构造函数参数的对象的构造,可扩展性及可维护性都有很好提升。当然该实现目前也尚不完备,目前只是类型绑定,也可以实现参数名字绑定等功能。上边论述的代码我放到了 https://github.com/leap-ticking/farrago 位置,欢迎取用。

2023-10-05 07:18:36 194

翻译 如何通过模板和友元来骇客C++

友元和模板是C++中强大的工具,就像 C++ 中的其他工具一样,它们的行为会让我们大吃一惊。而当结合在一起时会变得令人困惑的行为。并不是说C++的这些方面很少见,而是它们再次证明了语言已经变得多么复杂。

2023-08-20 07:41:19 84

原创 C++与依赖注入

S 单一职责原则O 开闭原则L 里氏替换原则I 接口隔离原则D 依赖倒置原则那与我们相关的也是依赖倒置原则,描述为我们的class应该依赖接口和抽象类而不是具体的类和函数。那么依赖注入也是符合这个原则,简单理解来说就是当依赖的某个对象是通过外部来注入,而不是自己创建。依赖应该大家都是知道的吧,举个最简单的例子:这里我们就可以说Human这个类依赖于Tools,那么我们说的对于这个依赖项是从外部创建继而注入到这个类中。

2023-07-07 07:32:53 1268

原创 linux下动态链接过程

elf文件动态链接

2023-06-11 08:47:16 1107

原创 由libunifex来看Executor的任务构建

之前的一篇文章讲述了future的优缺点,以及future的组合性,其中也讲述了构建任务DAG一些问题,同时给出了比较好的方案则是Executor。Executor还未进入标准(C++23),Executor拥有惰性构建及良好的抽象模型来构建任务DAG,libunifex则给出了相当具有标准的实现,我们也借助libunifex的简短的代码来看下构建任务DAG的便利性。

2023-04-10 07:55:29 468 1

翻译 lambda演进史(C++14/17/20)

lambda

2023-03-12 18:03:19 240

原创 谈C++的future

future

2023-03-07 21:40:17 2105

原创 源码看CAF的线程调度框架

CAF

2023-01-15 22:18:16 721

原创 C++之SFINAE

SFINAE

2022-10-23 10:11:26 839

原创 从源码看std::weak_ptr

weak_ptr

2022-06-25 09:42:14 515

原创 centos7升级到centos8

centos7升级到centos8

2022-06-01 21:29:37 3144

原创 使用dnf shell安装本地rpm包的遇到的问题

使用dnf shell安装本地rpm包的遇到的问题序dnf local installdnf shell注意总结ref序最近项目中使用dnf安装本地安装包遇到了2个问题,调试了蛮久,记录下来,也供大家参考。dnf是yum的升级版,在redhat8之后yum逐渐升级为dnf,基本的功能与yum差别不是很大本人使用dnf 4.4.2来实验,可能版本升级后有所不同。dnf local installdnf不仅可以安装仓库提供的rpm包,也可以安装本地打包或者下载好的rpm包。如果本地缺少依赖包,dnf

2022-05-22 07:49:12 1914

原创 koji使用外部仓库

序言使用koji来编译rpm包时,因为rpm包会依赖很多的其他的rpm包,而这时我们自己的build tag对应的rpm包又不足够时,我们就会使用外部仓库来提供依赖包,那么koji如何选择依赖包来自于build tag对应仓库还是来自于外部仓库呢?同时又会有什么样的条件呢?这就和我们引进外部仓库时使用的合并模式(merge mode)及优先级等等一些选项相关了。引进外部仓库使用指令就可以新建外部仓库$ koji add-external-repo -t dist-foo-build dist-foo

2022-03-12 11:43:18 1397 5

翻译 yum 仓库内部结构

序本文是我进行翻译的,以下为翻译的文章,文章来源为:https://blog.packagecloud.io/yum-repository-internals/摘要这篇文章通过针对yum仓库中的元数据(metadata<一些索引文件>)测试的方式,深入去了解下yum仓库的内部结构,我会介绍每个索引文件,并看下用户如何去检查元数据。什么是yum仓库yum仓库就是很多的rpm包和元数据的集合,元数据可以被yum命令行读取。有了yum仓库,你就可以让你针对一个安装包(package)或者一

2022-03-03 22:36:14 1672

原创 linux下给一个文件设置文件系统

前言在linux下,我们总有说磁盘分区给自己使用的需求,这里我们来通过给一个文件来进行分区等操作为例子,整体来梳理一下分区,建立文件系统,挂载等操作来梳理下这一整个流程。除此之外,我们给一个文件设置分区也有他的用处:1. 如果你需要在磁盘上多分一个区出来,但是没有可用的空间了,这时你可以使用文件来代替一个新的分区设备使用。2. 在制作镜像的时候,也可以使用这种方式,划分分区,建立文件系统后将镜像所需要的所有文件拷贝进去,进而制作成iso或者qcow2等格式的镜像文件供使用。规划一下输入结构我们使用p

2021-12-26 21:54:22 1222 2

原创 谈谈https和证书

1. 前言本篇文章我们讲解下关于https及证书的相关知识,因为我发现不理解证书感觉很难理解https,所以本篇会花大量的篇幅来讲证书,我们一开始会讲解一些相关概念帮助大家理解下,然后我们自己签发一个证书来理解这个过程,最后通过实例和抓包帮助大家理解https。因为本篇文章有很多代码及配置文件相关,最好通过电脑打开查看,篇幅很长,感谢耐心。2. 概念区分见到https时就会有很多不知道的概念,我们这里来区分下:HTTPS:https即为http及其下边一层的可靠的安全加密的传输协议(tls/ssl)

2021-10-30 20:40:03 7193

原创 解析C++中std::ref

1. 前言关于c++中的std::ref,std::ref在c++11引入。本文通过讲解std::ref的常用方式,及剖析下std::ref内部实现,进而再来讲解下std::reference_wrapper,然后我们再进一步分析为什么使用std::ref。2. std::ref 用法简单举例来说:int n1 = 0;auto n2 = std::ref(n1);n2++;n1++;std::cout << n1 << std::endl; // 2std:

2021-09-16 21:45:25 9291 9

原创 用systemd来进程间通信

1. 前言本文我们来通过主要讲解使用systemd进程间通信,达到让大家进一步了解systemd的一些概念。2. 什么是systemdsystemd是linux下一个管理daemon,进而甚至可以说是守护整个系统的程序,systemd代替了之前init方式。同时systemd作为所有进程的父进程,来孕育出来操作系统的所有进程。一些基本用法,以docker服务为例,systemd的命令都是以systemctl开头,即只有systemctl这个命令(传递参数不同)# 设置docker这个服务开机启动

2021-08-01 10:39:19 1016 2

原创 磁盘分区和开机启动

1 前言本文大概会来帮助大家解惑关于磁盘分区和开机启动的一些知识,会包括目前磁盘分区的格式,分区格式对应的系统启动流程。2 关于磁盘相信磁盘对于大家来说都不陌生,磁盘也是广为应用的保存大量数据的存储设备,存储的数量级可以达到M级,G级,甚至是T级别。 传统的磁盘也被称做机械硬盘,需要驱动马达传动磁盘,磁盘由盘片(platter)组成,如图中最左边是盘片的结构,图的右边是多个盘片视图,中间由主轴(spindle)串联多个盘片,盘片的上面和下面都可以存放数据,比较关键的是,盘片表面由磁道(tr

2021-07-05 09:20:42 1522 12

原创 rpm包如何构建

1. RPM(RedHat Packager Manager) Basics1.1 rpm和srpmrpm即软件包的一种管理方式,类似于安装包,使用它可以将相应的软件安装到系统上,包含的软件必须是经过编译的。格式为:unzip-6.0-20.el7.centos.es.x86_64.rpm(n: unzip, v:6.0, r: 20.el7.centos.es,a:x86_64)安装时会将软件信息写入到RPM数据库(/var/lib/rpm),便于查询。rpm -ivh /tmp/unzip-6

2021-05-16 09:37:19 1408 15

原创 koji架构及环境搭建

1. 序本文和大家讨论下koji的搭建过程,顺便其中的一些概念我会做一些讲解,顺便也是作为我koji环境搭建的一次记录。2. 什么是kojikoji是一套构建rpm包的软件系统,自身也是基于mock来做rpm包的build操作。一条指令,koji也是可以在多台电脑上进行编译。同时koji也是能作为针对编译的包的一些管理,能够一目了然。话不多说,我们就开始搞起。3. koji架构3.1 koji组件结构如上图,我大概画出来了相关的组件及相关的关系。koji-hub: 这个其实是整个koji架构

2021-04-13 09:15:19 5929 40

原创 谈一谈std::forward

上篇文章我们讲了移动语义相关知识本篇文章我们介绍下std::forward,我们会讲到引用折叠,完美转发,及std::forward与std::move进行比较1 引用折叠我们都知道通常情况下不能将一个右值引用绑定到左值上,即:int i = 0;int &&ii = i; // error当然也有例外的情况,左值传递给右值引用参数,且右值引用指向模板类型参数(T&&)template<typename T>void foo(T&&am

2021-03-09 07:55:05 692

原创 C++ 如何使用移动语义

1 前置c++11引入了右值引用和移动语义,可以避免一些拷贝,提高程序运行的性能。本文我打算简单介绍下左值右值及相关的概念,着重介绍如何使用移动语义,为什么使用以及怎么使用2 左值和右值看一条简单的赋值语句int a = 0;我们最简单的理解是,可以放到等号左边的是左值,只能放到右边的是右值。这个理解不能称之为错误,但是有些改动及例外,根据标准,左值即可以是有名字的,可以取地址的,右值不具名,不可以取地址,例如常见的字面量,函数返回值。int get() { return 0;}/

2021-02-01 15:47:34 977

原创 webrtc实现录制屏幕小工具

webrtc(网页即时通信)大家平常都会听到webrtc,那么webrtc是什么呢,实际上WebRTC是一个免费的开放项目,它通过简单的API为浏览器和移动应用程序提供实时通信(RTC)功能,而对于开发人员来说就是一组api。同时我们说webrtc上一组标准,协议也没错。已被Google、Mozilla、Opera等浏览器支持。chrome中录制桌面接下来我们通过使用webrtc中的api实现一个简单的录屏工具先来介绍下相关api:getDisplayMedia方法var promise =

2020-09-15 22:17:28 2510 11

原创 音视频基础

音频基础1 物理性质声音是由物体振动产生,振动的物体称为声源,声音的本质是机械波,以介质是空气为例,物体振动都会引起空气有节奏的振动,使周围的空气产生疏密变化,形成疏密相间的纵波,由此就产生了声波,这种现象会一直延续到振动消失为止。波的图像:声音有三个属性:音量(响度),音色,音调,这些我们物理学中也学过。我们从波的角度来解析下,声波的振动幅度描述的是音量的高低;振动频率和音调有关,振动频率越快,听起来音调越高;音色不同的声音,声音的波形不同(即周期性变化的曲线不同)。采集与量化我们将物理界声

2020-09-10 08:21:24 191

原创 C++的optional解析

optional用法1 问题引出编程中我们可能会遇到要处理可能为空的变量,比如说容器,基本类型,或者说对象实例,我们简单看个例子:#include <string>#include <vector>#include <memory>struct Some{ int some_i_ = 0; std::string some_str_;};SomegetSome(const std::vector<Some>& s

2020-08-16 23:02:20 12481 1

原创 内存模型下的顺序一致性

什么是内存模型在多核多线程环境下,多个CPU是如何以一种统一的方式来与内存交互的,这里包括内存地址对线程的可见性,cpu对内存的访问的顺序性。关于乱序我们先来看代码:#include <thread>#include <iostream>using namespace std;bool ok = true;int val = 0;void foo() { while (1) { if (!ok) { cout &l

2020-08-05 08:04:57 439

原创 自己实现简单的动态分配器

自己实现简单的动态分配器前言动态内存分配分配器的要求碎片实现问题空闲块的组织结构前言本文简单论述下动态分配的原理,并自己实现一个最简单的动态分配器,本文完全参照《深入理解计算机系统》,以此来当做一个笔记记录一下学习历程。下边就进入正文。动态内存分配可执行程序运行时被加载到内存中,这个进程的虚拟内存区域分成几部分,这个我们之前的文章讲过。动态内存分配器就是维护着虚拟内存中的堆。堆区域想上生长(向更高的地址)。分配器有两种基本风格。两种风格都要求应用程序显式的分配块,他们的不同之处在于由哪个实体负责释

2020-06-21 16:17:25 545

原创 windows下异步IO二

介绍本文是基于windows下异步IO一的后续,上一篇我们讲了关于windows异步io设备访问,包括初始化设备,执行IO设备请求,IO请求完成的通知三个部分,其中完成通知我们说有四种方式,上一篇我们讲了其他的三种,如果有兴趣请先移步上一篇文章。这篇文章我们主要介绍IO完成通知的最后一次方式,IOCP(完成端口)。创建完成端口首先完成端口是一个内核对象,有专有的api来创建CreateIoC...

2020-03-08 11:17:52 416 1

原创 windows下异步IO一

介绍简单讲解下我们程序进行IO的过程,当线程进行一个同步的设备IO请求时,他会被挂起,直到设备完成IO请求,返回给阻塞线程,线程激活继续处理。当进行一个异步的设备IO请求时,该线程可以先去做其他事,等到设备完成IO请求后通知该线程进行处理。本文讨论在windows平台下的异步设备IO。同时在一些示例中会对涉及到的知识进行讲解。1.异步设备IO执行进行异步设备io时我们来做一下下准备工作,首先...

2020-02-16 15:33:17 2071

WinIPC.zip

windows下进程间通信 本资源跟随 https://blog.csdn.net/leapmotion/article/details/104324818 https://blog.csdn.net/leapmotion/article/details/104727196 文章讲解

2020-03-08

C++ 实现WebSocket 服务器

利用C++实现了websocket server, 使用libuv作为实现tcp的基础,另外使用gbase作为工具

2018-12-07

ffmpeg + SDL + Opengl 简要的播放器(参照雷神博客)

参照雷神的博客:https://blog.csdn.net/leixiaohua1020/article/details/38868499 完成的sdl+ffmpeg+opengl的简要播放器

2018-11-28

C++ 实现序列化

C++实现序列化,简单的讲是将C++里的对象(此处是广义上的对象,内置类型或者用户自定义类型)数据变成char*,即单个字节的数据,这样方便传输等,涉及到的知识点有C++中的函数重载,操作符重写,allcotor,左值和右值,继承,模板等

2018-11-03

CEF 下C++与JS交互

CEF 下C++与JS交互,使用三种方式进行,摘自CEF官方文档并修改后的产出

2018-06-29

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除