自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(19)
  • 收藏
  • 关注

原创 现代 C++ 中的虚拟内存分布

本文深入探讨了现代C++开发中的虚拟内存地址分布,重点介绍了Linux 64位进程的典型内存布局。文章从高地址到低地址依次解析了栈、内存空洞、堆、内存映射区、BSS段、数据段和代码段的特点及用途。栈用于函数调用相关数据,堆负责动态内存分配,内存映射区处理共享库和文件映射,BSS段存储未初始化全局变量,数据段存放已初始化变量,代码段则包含程序指令和常量。通过代码示例直观展示了各内存区域的变量分布,帮助开发者理解内存管理机制以优化程序性能。

2025-12-10 16:11:43 797

原创 同步异步日志系统设计与实现

本文介绍了一个高效同步异步日志系统的设计与实现。该系统采用建造者模式构建日志器,支持灵活的配置选项。通过等级划分和格式化处理,实现了高性能、低延迟的日志记录功能。系统支持同步和异步两种写入方式:同步日志器直接写入日志消息,而异步日志器通过队列处理高并发写入请求。日志器与业务逻辑解耦,便于维护扩展。源码地址:https://github.com/LiuJiaxuan1024/Logging-System

2025-12-08 22:32:44 1045

原创 Linux 基于 Epoll 的主从 Reactor 多线程模型

本文介绍了基于Epoll的主从Reactor多线程模型实现。该模型通过事件驱动机制高效处理网络请求,核心组件包括主Reactor监听新连接、从Reactor处理I/O事件以及Handler执行具体逻辑。文章详细解析了Connection类的缓冲区管理、回调机制和资源管理设计,以及Epoll封装类的实现要点。该模型采用主从分离架构,充分利用多核CPU资源,适合高并发场景。代码实现展示了Epoll的事件监听、事件处理机制及错误处理流程。

2025-12-07 22:42:06 1128

原创 C++ 中的模版元编程

摘要:C++模板元编程是一种在编译期进行计算和代码生成的高级技术,通过模板特化、递归实例化和类型操作实现零运行时开销的优化。核心概念包括编译期计算、类型操作和递归模板实例化。文章介绍了基础语法如类模板结构和编译期值计算(以阶乘为例),并对比了传统模板与现代constexpr方法的差异。重点讲解了类型萃取技术,包括自定义is_same实现和标准库工具的使用,展示了如何通过模板特化和变量模板简化类型操作。最后指出现代C++特性(如constexpr)可以替代部分模板元编程场景,但在类型系统和编译机制中仍具有不可

2025-12-07 22:30:59 638

原创 现代 C++ 之 constexpr 编程

如何提高运行期间效率?快来学习constexpr的使用吧!

2025-12-07 22:21:08 807

原创 高并发内存池项目(简化版tcmalloc)

手把手教你实现一个高并发内存池

2025-12-07 22:11:19 1168

原创 TCP协议(Transmission Control Protocol)

TCP协议,即传输控制协议,其最大的特征就是对传输的数据进行可靠、高效的控制

2025-02-17 22:18:20 1134 2

原创 进程间通信--管道通信

管道通信不仅仅只局限于父子进程,只要是由血缘关系的进程都可以进行管道通信,例如,父进程创建两个子进程,随后父进程将读写端都关闭了,这时两个兄弟进程的读写段都和父进程一样,故他们直接也可以构成管道通信,父进程创建的子进程,子进程再创建一个子进程,那么由于父进程和它孙子进程的读写段相同,故也可以构成管道通信。因此,管道通信是有一定协议的,不然这种现象会导致子进程被频繁地阻塞,协议在这里暂不做说明,我们只需要知道没有协议的话进程通信就很容易出现诸如上述现象,由此可以看出,管道是面向字节流的。

2024-08-27 21:34:06 1033 1

原创 Linux软硬链接讲解

因此,文件前面的硬链接数实际就是一个引用计数的计数器,他所代表的是有多少个文件名指向该inode,正时因此,一般创建的文件默认硬链接数是1,因为只有这个文件名指向该inode,当我们增加新文件名指向该inode时,引用计数的计数器会加加,删除则减减,而当计数器在减减变成0的时候,操作系统就会将该文件删除,这就是为什么硬链接后删除文件不会删除内容的原因,因为计数器并没有减到0,证明还有文件名指向它,就不能删除。这是因为新创建的文件里面会有隐藏文件“..”,该文件指向文件上一层目录。

2024-08-23 14:31:51 1218 1

原创 Linux进程地址空间讲解(一)

针对第三点,因为一个页表存储的信息有虚拟地址,所映射的物理地址,访问权限,以及是否在内存中存储,这样的话我们就可以通过判断进程是否在内存中从而对是否需要运行该进程和如何运行该进程做出判断,因此进程管理模块和内存管理模块就可以分开进行管理,不会因为内存管理出现问题而导致进程管理受到限制,这种现象就叫做解耦合。2.增加进程虚拟地址空间可以让我们访问内存的时候,增加一个转化的过程,在这个转化的过程中,可以对我们的寻址请求进行审查,所以一旦异常访问,直接拦截,该请求不会到达物理内存,保护物理内存。

2024-08-14 19:48:25 927 1

原创 C++引用知识详解

初学C++引用需要掌握的知识点

2024-01-23 19:23:54 1465 1

原创 单链表的创建(头插法和尾插法)、打印及删除

单链表代码编写的详细介绍

2023-12-06 22:14:00 2371 1

原创 C++ 将const用于指针时的注意事项

上述代码将非const 地址(&pl)赋给了const 指针(pp2),因此可以使用pl来修改const 数据,表面上编译器没有报错,但实际上是无法运行的因此,仅当只有一层间接关系(如指针指向基本数据类型,最上面开头讲到的第一个例子即是)时,才可以将非const地址或指针赋给const 指针。因为const修饰a就是为了让a的值不被改变,但我们如果将a的值赋给指针p,不就可以通过指针p来间接改变a的值了吗,那const对a的修饰不就没有意义了吗,因此这样肯定是不行的哦。三、两级间接关系的const使用。

2023-12-04 10:41:18 608

原创 C++中数组的替代品

当然了,如果我设置n为2,那就会出现下标越界的现象,系统虽然不会提示,但运行起来会有很大的麻烦,这种模板类虽然可以让系统自动帮你释放内存,但是代价就是牺牲了时间成本,没错,vector运行效率不高,因此,如果您想定义一个长度固定的数组,不妨看一看下面这个模板类。首先,注意到无论是数组、vector对象还是 array对象,都可使用标准数组表示法来访问各个元素。与数组一样,array对象的长度也是固定的,也使用栈(静态内存分配),而不是自由存储区,因此其效率与数组相同,但更方便,更安全。

2023-12-03 10:06:06 592 1

原创 cin函数使用的三大注意事项(第三条尤为重要)

但这里更推荐使用get()函数 ,因为get()函数比getline()函数适应更多的版本,且get()函数读取的更仔细,例如get()函数可以判断停止读取的原因是数字被填满了还是读取了换行符,而getline若因数组满了而停止读取,后面的getline也就将不会执行。3、在输入字符串时,如果想将空格符号也输入进去,就必须使用get(或者使用getline)从而读取整个字符串,若直接使用cin函数将会导致只能读取空格前面的内容,如果后面仍然有cin函数,则会将字符串空格后面的内容直接读入。

2023-12-02 10:01:37 1007

原创 初学C++需要注意的有关cout的几点事项

2、可改变cout输出的整型、无符号整型或长整型的常量或变量的格式,可改变为十进制、八进制或十六进制,但无法改变浮点数的格式,且这些像"cout<<hex"这些改变进制的代码不会在屏幕上显示任何内容,且cout一旦改变输出进制,例如改变为输出十六进制,如果不手动将其改回十进制,后面输出的数字将一直以十六进制输出。其中的大小写随意,也可以大小写结合,但因为小写的‘l'与1长的太像,因此建议在写long或long long后缀时,将第一个’L‘写为大写。1、cout可用来输出一段语言或者输出一个常量或变量。

2023-12-01 22:32:28 796 1

原创 通讯录代码编写

防重名的通讯录代码

2023-11-28 19:44:45 1724

原创 一个你永远都赢不了的三子棋

--------------------------------------------------------------------------------------------------------------------------------下面讲解玩家第一步没有下在中间的情况,这样来看的话电脑第一步直接将棋下在中间就行了,即。这里的'w'是在开始的时候监测棋盘中玩家下的棋的个数,因为只需要在玩家在中间下了一棋之后电脑在四角下棋,其他情况就没有必要了,故w==1时才能在四角任下一棋。

2023-11-20 20:30:19 229 2

原创 改变一个字符从而反转程序的执行目的

改变一个字符使得程序反向执行结果

2023-11-13 17:35:48 187 1

空空如也

空空如也

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

TA关注的人

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