自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

ocfbnj的博客

万丈高楼平地起

  • 博客(61)
  • 收藏
  • 关注

原创 目录

文章目录C++C++C++函数的调用约定C++代码布局C++线程池C++20:协程C是C++的子集吗?C++20:使用协程实现简易生成器C++实现字符串与数值转换解决vs使用std::cin.sync()无法清空输入缓冲区

2020-11-06 16:54:27 158

原创 Asio源码分析(3):使用epoll实现Proactor模式(1)

使用epoll实现Proactor模式(1)文章目录使用epoll实现Proactor模式(1)Proactor设计模式使用Reactor模拟ProactorAsio函数调用过程参考下面是一段Asio中典型的代码(忽略错误处理和tcp消息边界相关问题):#include <iostream>#include "asio.hpp"char read_buf[4096];int main() { asio::io_context ctx; asio::ip::tcp

2021-08-02 21:25:14 60

原创 Asio源码分析(2):Asio用到的C++技巧和优化

Asio源码分析(2):Asio用到的C++技巧和优化文章目录Asio源码分析(2):Asio用到的C++技巧和优化使用析构函数执行清理操作使用模板元编程模拟概念使用对象池避免对象频繁地创建和销毁使用函数指针和继承实现多态使用继承共享数据而不是实现多态(虚函数)参考Asio中用到了一些C++技巧和优化,第一次阅读源码时可能会有一些困惑(confuse)。这篇文章先简单介绍其中的一小部分,方便后面的分析。使用析构函数执行清理操作Asio使用对象的析构函数在作用域结束时执行一些清理操作,有点类似于Go语

2021-07-27 11:09:22 53

原创 Asio源码分析(1):概述

Asio源码分析(1):概述文章目录Asio源码分析(1):概述Proactor和Reactor设计模式参考Asio是一个跨平台的C++网络库,目前它的一部分已经成为了C++ Networking TS(C++ Technical specifications),并有望加入到C++23。从Asio将并入标准库这一点来看,它应该是一个不错的网络库,有一定的学习价值。这是Asio源码分析系类文章的第一篇,这个系列要解决的问题主要有:Asio的源码用到了哪些C++技巧,做了哪些优化?在Linux下,A

2021-07-26 11:27:20 50

原创 CMake教程

CMake教程CMake是一个构建系统,可以用于构建跨平台的C和C++项目。其它的构建系统有makefile、MSBuild以及qmake。使用CMake作为C或C++的构建系统已经变得越来越流行了,例如:在Jetbrains的C++ 编程 - 2020 开发人员生态系统信息图调查中,CMake是最流行的构建系统。CMake是CLion的默认构建系统。CMake是Qt6的默认构建系统,之前是qmake。Visual Studio IDE将对CMake的支持添加到2020年规划的路线图中。许多

2021-01-20 23:08:48 141

原创 Linux下的进程间通信

Linux下的进程间通信文章目录Linux下的进程间通信引入管道FIFO与管道的区别POSIX共享内存System V IPC消息队列共享内存与POSIX共享内存的区别缺点套接字网络套接字字节流套接字数据报套接字UNIX域套接字与网络套接字的区别不同IPC的比较总结参考引入进程间通信(Inter-Process Communication)是指两个进程间传递数据的方法。在Linux下常见的有管道、FIFO、POSIX定义的共享内存,信号量和消息队列、System V定义的共享内存,信号量和消息队列,以

2020-12-21 21:03:58 97

原创 C程序的内存布局

C程序的内存布局理解C程序的内存布局非常重要。这篇文章将说明C程序的内存布局,并通过一些工具和程序来验证它们。内存布局是与平台相关的,这篇文章的测试的环境为:Ubuntu 20.04 64位gcc version 9.3.0文章目录C程序的内存布局预备知识典型的C程序内存布局1. 文本段2. 初始化的数据段3. 未初始化的数据段4. 堆5. 栈验证简单的测试程序通过objdump验证参考预备知识在开始之前,需要了解objdump工具的基本使用,如果你已经非常熟悉它们,请跳过这部分。我们将

2020-11-24 19:13:00 133

原创 C和C++实现可变参数函数

C和C++实现可变参数函数C语言中的printf相关的函数,C++中的emplace相关的函数都使用了变参函数。这篇文章将简单介绍C和C++的不同实现方式。文章目录C和C++实现可变参数函数C语言实现可变参数函数一个简单的例子va_list类型va_stat宏va_copy宏va_end宏va_arg宏C++实现可变参数函数通过std::initializer_list实现变参函数一个简单的例子类模板std::initializer_list通过参数包实现变参函数基础知识一个简单的例子使用折叠表达式简化

2020-11-22 12:30:12 98

原创 gcd和lcm算法

gcd和lcm算法gcd(greatest common divisor)为最大公约数,lcm(least common multiple)为最小公倍数。gcd算法下面的算法是欧几里得算法(Euclidean algorithm),也叫辗转相除法。int gcd(int a, int b) { if (b == 0) { return a; } return gcd(b, a % b);}lcm算法两个整数的最小公倍数与最大公因数之间有如下的关系:

2020-11-11 19:57:21 723

原创 基本的套接字函数

基本的套接字函数文章目录基本的套接字函数socket函数概要domain参数type参数protocol参数返回值domain和type常见的组合对比AF_XXX和PF_XXX(地址族和协议族)bind函数概要addr和addrlen参数返回值connect函数概要addr和addrlen参数返回值listen函数概要backlog参数返回值accept函数概要addr和addrlen参数返回值close函数概要fd参数返回值描述符引用计数shutdown函数概要how参数返回值参考socket函数概

2020-11-06 19:44:42 146

原创 inet_pton和inet_ntop函数

inet_pton和inet_ntop函数文章目录inet_pton和inet_ntop函数inet_ptoninet_ntop例子参考inet_pton和inet_ntop是两个新函数,它用来代替inet_aton、inet_addr和inet_ntoa函数。inet_pton和inet_ntop适用于IPv4和IPv6地址。inet_pton#include <arpa/inet.h>int inet_pton(int af, const char *src, void *dst

2020-11-05 22:55:33 159

原创 套接字地址结构

套接字地址结构文章目录套接字地址结构IPv4套接字地址结构通用套接字地址结构IPv6套接字地址结构新的通用套接字地址结构套接字地址结构的比较参考大多数套接字函数都需要一个指向套接字地址结构的指针作为参数。每个协议族都定义了它自己的套接字地址结构。这些结构的名字均以sockaddr_开头,并以对应于每个协议族的唯一后缀结尾。IPv4套接字地址结构IPv4套接字地址结构以sockaddr_in命名,定义在头文件<netinet/in.h>中。下面是Linux下的定义(已简化):struct

2020-11-05 13:05:46 138

原创 C++函数的调用约定

C++函数的调用约定文章目录C++函数的调用约定引入常见的调用约定__cdecl__stdcall__fastcall参考引入调用约定允许你指定被调函数和调用者之间传递参数和返回值的方式。不同的调用约定区别主要在于:参数和返回值放置的位置。参数传递的顺序。调用前设置和调用后清理的工作,在调用者和被调用者之间如何分配。并非所有约定都在所有支持的平台上可用,某些约定使用平台特定的实现。这篇文章描述的是x86平台。在 x86 平台上,所有参数在传递时都将加宽到 32 位。 返回值也将加宽到 3

2020-10-28 14:34:23 94

原创 TCP连接的建立和中止

TCP连接的建立和中止文章目录TCP连接的建立和中止TCP连接的建立TCP连接的中止TCP状态转换图观察分组TIME_WAIT状态参考理解TCP连接的建立和中止,有助于我们理解connect、accept和close这3个函数。TCP连接的建立服务器准备好接受外来的连接。这通常通过调用socket、bind和listen这3个函数来完成,我们称之为被动打开(passive open)。客户通过connect发起主动打开(active open)。这导致TCP客户发送一个SYN分节,它告诉服务器客

2020-10-26 12:55:46 137

原创 Linux系统引导过程

Linux系统引导过程理解引导过程可以帮助你解决引导系统时遇到的问题。引导过程涉及一些文件,这些文件中的错误通常造成了引导问题。引导过程和配置是不同的,这取决于你的硬件是使用UEFI固件还是传统的BIOS去处理系统引导。该文章描述的操作系统为Oracle Linux 8。UEFI引导在一个基于UEFI的系统中,系统引导过程按如下顺序执行:系统的UEFI固件执行开机自检(POST),然后定位和初始化外围设备,包括硬盘。UEFI查找一个带有特定的全局唯一标识符(GUID)的GPT分区,标识符

2020-10-22 22:51:28 125

原创 C++代码布局

C++代码布局问题一致的布局是很有用的,C++对代码的布局没有严格要求,这导致了许多C++代码都有不一样的布局风格,阅读起来很不方便。在我们周围存在许多不同风格的代码布局,人们赞同或反对它。实际的项目可能包含了许多不同来源的代码,因此,统一代码的布局通常是不可能的。但是,在你不知道使用或不被要求使用某种布局时,使用一种统一的布局是明智的做法。我们可以通过IDE或一些工具来格式化我们的代码,例如Visual Studio IDE和clang-format工具。C++核心指南(C++之父参与编写)提供

2020-10-09 14:16:19 145

原创 C++线程池

C++线程池文章目录C++线程池介绍使用C++实现线程池1. 查看系统支持的最大线程数量2. 线程池的方法和数据结构3. 线程池的构造函数4. 无限循环的函数5. 线程池的析构函数6. start函数测试参考资料C++线程池的简单实现。完整代码:https://github.com/ocfBNj/ThreadPool介绍线程池(英语:thread pool):一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免

2020-10-07 17:14:24 174 1

原创 使用CocosCreator开发的FC坦克大战

游戏预览:https://tank.ocfbnj.cnApp下载:https://app.ocfbnj.cnGitHub仓库:https://github.com/ocfBNj/CocosCreatorTank除了道具和双人游戏没有完成,其他功能基本与原版游戏相同。因为Cocos Creator是跨平台的游戏开发工具,因此该游戏可以运行在Web、IOS、Android、Windows、Mac以及各个小游戏平台。下面是一些运行截图:...

2020-10-05 16:10:06 438 1

原创 稀疏表

文章目录稀疏表构造稀疏表查询范围最小值洛谷P3865 ST表稀疏表学习稀疏表:https://www.youtube.com/watch?v=c5O7E_PDO4U稀疏表(Sparse Table),也叫ST表,用来解决范围最值查询(Range Minimum Query)问题。假设有一个数组,我们需要对该数组执行如下操作(以下全部假设数组下标从0开始):求一个区间[low,high][low,high][low,high]内的最大值不同的解决方法所花的时间不同:解决方法预处理时

2020-10-05 15:00:06 190

原创 使用VS Code进行Qt开发

使用VS Code进行Qt开发Qt Creator界面不美观,而VS Code更漂亮一些。因为Qt5支持使用CMake进行构建,而VS Code也可以支持CMake构建系统,因此是完全可以的。测试环境Qt 5.15.0CMake 3.17.5Visual Studio 2019 16.7.5(使用C++的桌面开发)Visual Studio Code 1.49.3步骤1. 将Qt的bin目录添加到环境变量假设Qt安装在C:\Qt,那么将C:\Qt\5.15.0\msvc2019_64

2020-10-04 19:47:05 21972 31

原创 线段树

文章目录线段树构造线段树使用普通方式求范围和懒惰传播(lazy propagation)使用懒惰传播的方式更新范围值使用懒惰传播的方式求范围和洛谷P3372 线段树1线段树学习线段树(segment tree):https://www.youtube.com/watch?v=ZBHKZF5w4YU学习线段树的懒惰传播(lazy propagation):https://www.youtube.com/watch?v=xuoQdt5pHj0首先简单介绍一下什么是线段树,以及为什么要使用线段树。假设有

2020-10-04 13:10:50 145

原创 洛谷P3368 树状数组2

文章目录洛谷P3368 树状数组2题目链接树状数组差分数组解决洛谷P3368 树状数组2题目链接https://www.luogu.com.cn/problem/P3368树状数组学习树状数组:https://www.youtube.com/watch?v=v_wj_mOAlig首先简单介绍一下树状数组,以及为什么要使用树状数组。假设有一个数组,我们需要对该数组执行如下操作(以下全部假设数组下标从1开始):求前i项的和。将第i项元素加上某个给定的值。如果使用普通的数组,执行第一个操作

2020-10-03 20:15:14 92

原创 C++20:协程

文章目录协程理论协程是函数,函数是协程“普通”的函数活跃帧“调用”操作”返回“操作协程协程的活跃帧“暂停”操作“恢复”操作“摧毁”操作协程的“调用”操作协程的“返回”操作一个插图总结参考协程理论这是C++ Coroutines TS系列文章的第一篇,Coroutines是一种新的语言特性,目前有望纳入C++20语言标准(已经纳入)。在这个系列中,我将讨论C++协程底层的工作机制,以及展示它们如何被用来构建高级抽象。在这篇文章中,我将描述函数和协程的差异,并且提供一些有关它们支持操作的理论。这篇文章的

2020-10-01 16:38:09 663

原创 如何编写Go代码

文章目录如何编写Go代码引入代码组织你的第一个程序从你的模块导入包从远程模块导入包测试参考资料如何编写Go代码引入这篇文章演示了在一个模块内如何去开发一个简单的Go包,并且引入了go工具,他是用于获取,构建和安装Go模块,包和命令的标准方式。注意:这篇文章假定你正在使用Go1.13及之后的版本,并且GO111MODULE环境变量没有被设置。代码组织Go程序被组织为包。一个包是源文件的集合,这些源文件在同一个目录并且被一起编译。被定义在一个源文件中的函数,类型,变量和常量,对于相同包之内的其他源文

2020-08-20 13:57:43 175

原创 Go语言new和make的区别

new vs makeGo有两种分配原语,分别为new和make。他们做的事情不同,并且处理不同的类型,这看上去让人感到困惑,但是规则相当简单。newnew是一个用来分配内存的内置函数(C++中是运算符),但他和大多数其他语言不同,new不会初始化内存(C++中会分配并调用构造函数),而是将内存归0(也就是初始化成0)。即,new(T)给类型T分配了一个存储了0值的内存并且返回它的地址(在C++中相当于先调用malloc分配内存,然后调用memset初始化内存),返回的类型为**T*。用Go的术语来说

2020-08-20 12:27:27 185

原创 使用Certbot申请免费泛域名SSL证书

文章目录使用certbot申请免费泛域名SSL证书测试环境预备需求详细步骤将证书配置到服务器使用certbot申请免费泛域名SSL证书测试环境Ubuntu Server 20.04阿里云域名cerbot版本1.7.0其他环境请参考cerbot指南https://certbot.eff.org/instructions预备需求域名root权限详细步骤登录到服务器安装snapd(ubuntu 20.04已经默认安装,如果没安装请参考https://snapcraft.io

2020-08-15 13:08:19 884

原创 Ubuntu20.04使用nmcli配置网络连接

文章目录Ubuntu Server 20.04使用nmcli配置网络连接预备需求步骤例子:使用nmcli配置静态ip地址相关资料Ubuntu Server 20.04使用nmcli配置网络连接预备需求Ubuntu Server 20.04root权限可以访问互联网步骤安装network-managersudo apt install network-manager使用ip addr查看要配置的网卡cc@ubuntu:~$ ip addr1: lo: <LOOPBAC

2020-08-09 13:55:18 3675

原创 C++20:使用协程实现简易生成器

学习C++协程https://lewissbaker.github.io/C++协程TS已并入C++20,VS2017或2019暂不完全支持协程,使用头文件experimental/coroutine及命名空间std::experimental。支持协程则替换为使用头文件coroutine及命名空间std即可。注意,VS2017或2019需添加命令行选项/await,不然会出现类似message : Please use '/await' command-line option to enable re

2020-08-07 23:11:51 276

原创 Centos 8配置和管理网络

Centos 8配置和管理网络下面介绍3中配置方式使用nmtui安装NetworkManager-tuidnf install NetworkManager启动nmtuinmtui之后将看到如下界面,根据对应选项进行配置即可使用Web控制台启用web控制台(请查看上一篇博客)登录web控制台在左侧点击网络选项,即可在右边进行配置手动编辑配置文件(不推荐)编辑/etc/NetworkManager/system-connections/下的if

2020-07-27 22:04:31 223

原创 使用浏览器管理Centos 8

使用浏览器(Web控制台)管理Centos 8预备需求安装了Centos 8的机器可以访问互联网什么是Web控制台web控制台是一个用于管理和监视系统的web界面,它可以管理服务管理用户账户管理和监视系统服务配置网卡和防火墙查看系统日志远程终端安装Web控制台安装cocopitdnf install cockpit启用(enable)和开启(start)cockpit.socket服务,这将运行一个web服务器systemctl enable --now

2020-07-27 21:34:47 369

原创 使用C++ X DevAPI连接MySQL8
原力计划

使用C++ X DevAPI连接MySQL8预备需求测试环境:Windows 10 64位Visual Studio 2019CMake 3.17.3(使用CMake构建时需要)MySQL 8.0.20其他平台请参考官方文档https://dev.mysql.com/doc/connector-cpp/8.0/en/第1步 获得C++连接器在Windows平台可以通过MySQL Installer获得Connector/C++也可以直接下载https://dev.mysql.com

2020-07-13 22:56:00 954 2

原创 从C++到Go(三)

从C++到Go(三)运算符++和--运算符不能在表达式中使用,只能在语句中使用。你不能编写如c = *p++的代码。p++被解析为(*p)++。Go的运算符优先级和C++不同。例如,在Go中,4 & 3 << 1为0, 而在C++中为4。Go运算符优先级:1. * / % << >> & &^2. + - | ^3. == != < <= > >=4. &&amp

2020-06-02 11:52:41 112

原创 VS2019中文锯齿解决方法

只需要安装一个扩展即可,步骤如下1 打开扩展商店2 搜索Text Sharp并安装3 设置Text Sharp1 打开扩展商店2 搜索Text Sharp并安装安装后会提示关闭vs,关闭后根据提示安装即可3 设置Text Sharp打开设置或直接搜索Text Sharp然后修改这两个地方即可解决问题...

2020-05-05 20:55:52 664

原创 C是C++的子集吗?

文章目录引入例子1. void*类型2. 字符字面值3. 字符串字面值参考引入很多人都认为C是C++的子集,但严格来说并不是,下面给出几个例子。例子1. void*类型在C语言中,void*可以隐式转换为任何类型,但在C++语言中不合法!2. 字符字面值在C语言中,字符字面值是int类型,而在C++语言中,字符字面值是char类型。3. 字符串字面值这是一个很常见的错误,...

2020-04-27 11:39:55 778

原创 Qt模型/视图教程

模型/视图教程1文章目录模型/视图教程[^1]1. 引入1.1 标准widget1.2 模型/视图提供解决方案1.3 模型/视图widget概览1.4 在表单和模型间使用适配器2. 一个简单的模型/视图应用程序2.1 一个只读的表2.2 使用角色(Role)扩展只读的案例2.3 将钟嵌入表的单元格2.4 设置列和行标题2.5 小的编辑案例3. 进阶话题3.1 TreeView3.2 处理选择3....

2020-04-26 00:57:31 612

原创 选择算法(顺序统计量)

代码如下,具体思路请参考《算法导论》#include <iterator>template <typename RanIt>inline RanIt partition(RanIt first, RanIt last) { if (first == last) return first; --last; // pivot RanIt it = first;...

2020-04-04 23:22:42 290

原创 从C++到Go(二)
原力计划

从C++到Go(二)上一节讲完了概念差异,这节讲解语法语法声明语法和C++相反,类型跟在名字后面。类型的语法和变量的使用方式与C++不同。类型声明可以很容易地从左向右阅读。(var v1 int -> 变量v1是一个int)//Go C++var v1 int // int v1;var v2 string ...

2020-03-19 12:30:20 92

原创 C++实现字符串与数值转换

在C++之父的官网看到的,利用stringstream即可#include <string>#include <sstream>template <typename _Ty>std::string toString(const _Ty& value) { std::ostringstream os; os << va...

2020-03-12 22:13:55 407

原创 从C++到Go(一)

从C++到Go (一)1在开始之前,我建议你以一个通用的目的(而不是以C++的角度)了解一下Go编程语言。The Go Tour是一个非常棒的资源(虽然在国内无法正常访问)。Go和C++一样,是一种通用的系统编程语言。对于有经验的C++程序员来说,使用Go语言有一些注意事项。这篇文章讨论了Go和C++之间的差异。非常重要一点是,这两种语言的思维过程存在一些根本的差异,C++的对象模型基于类和...

2020-03-05 20:24:08 314

原创 使用Python转换文件格式

使用Python高效转换文件格式在编程的过程中,有时会遇到需要转换文件格式的情况。例如视频,音频,图片等。预备需求Python3.8及以上ffmpeg(用于转换视频和音频格式,在官网下载即可)Pillow(用于转换图片格式,使用pip获取python -m pip install Pillow)实现实现音频格式转换import os# 要转换的文件所在目录source_p...

2020-02-16 10:26:45 1645

空空如也

空空如也

空空如也

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

TA关注的人 TA的粉丝

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