- 博客(78)
- 收藏
- 关注
原创 从 C 到 C++:详解不定参数的两种实现方式(va_args 与参数包)
摘要:本文对比了C语言的va_args宏和C++11参数包两种不定参数实现方案。va_args通过宏处理栈上参数,需手动指定类型,存在类型不安全、不支持对象等局限。C++参数包基于模板,支持类型推导和编译期展开,提供递归和折叠表达式两种展开方式,具有类型安全、支持任意类型等优势。通过实现printf和日志函数案例,展示了参数包在类型安全性和灵活性上的明显改进,推荐C++项目优先采用参数包处理不定参数需求。
2025-12-11 21:53:30
621
原创 高并发内存池补充:超过 256KB 大内存的基数树管理方案
本文探讨了如何通过基数树(Radix Tree)优化大内存(>256KB)管理。基数树通过分层索引机制,将64位页号拆分为多层前缀索引,实现高效页号到Span的映射,解决了传统数组和哈希表在大内存场景下的空间浪费与效率问题。文章详细介绍了2层和3层基数树的设计实现,包括页号拆分逻辑、类封装方法和核心功能实现。通过集成到PageCache中,基数树支持大内存的快速分配、回收和页合并操作,性能测试显示比malloc/free快20%-40%。基数树在空间占用和范围查询方面具有明显优势,是高并发内存池管理大
2025-11-16 18:59:44
876
原创 开发实战项目---高并发内存池_tcmalloc底层基数树优化
本项目实现了一个高并发内存池,其原型为Google开源项目tcmalloc。该内存池采用三层架构设计:ThreadCache(线程私有无锁缓存)、CentralCache(共享中心缓存)和PageCache(全局页缓存)。通过TLS技术实现线程本地存储,避免锁竞争;采用慢开始算法动态调节内存分配,优化内存利用率;支持内存碎片合并,有效减少外碎片。测试表明,该内存池在多线程环境下性能显著优于系统默认的malloc/free,尤其适合高并发场景。项目涵盖C++、数据结构、操作系统和多线程编程等核心知识,通过实现
2025-11-16 18:50:09
568
原创 自写Linux系统下的多线程文件拷贝工具:对比自带单线程拷贝命令cp
本文介绍了一个C++实现的多线程文件拷贝工具,通过分块并行的方式提升大文件拷贝效率。核心思路是将大文件分割为固定大小的块,每个线程负责拷贝一块,最后合并成完整文件。文章详细解析了代码实现:包括文件分块逻辑、线程同步机制、缓冲区读写等技术细节,并提供了完整的可编译代码和使用说明。该工具相比单线程拷贝能显著提升大文件传输速度,同时通过预定义写入位置确保文件顺序正确,适用于视频、压缩包等大文件的快速拷贝场景。
2025-11-16 18:40:35
1754
原创 VsCode通过SSH远程连接云服务器遇到主机密钥变更问题
服务器密钥更新的常见场景包括系统重装、管理员手动更新、云服务器实例更换或SSH服务重新配置。密钥变更后需删除本地known_hosts文件中的旧密钥,否则SSH会因安全机制拒绝连接。更新步骤:1)打开PowerShell;2)执行"ssh-keygen-R<服务器IP>"删除旧密钥;3)重新连接并接受新密钥。这一过程可解决因密钥变更导致的连接问题,同时保障SSH连接的安全性。
2025-11-14 22:21:10
289
4
原创 2025 最硬核技术创新,重构 AI 感知与决策逻辑
2025年原生多模态大模型技术将实现三大突破:1)架构革命:采用统一训练框架,端到端对齐多模态数据,解决传统模型的模态偏置问题;2)核心技术创新:突破模块化双工注意力机制,实现INT4量化与混合架构优化,支持3D空间和长时序理解;3)产业应用:在工业质检、人机交互和边缘设备等领域实现规模化落地,推动AI从辅助工具向业务核心引擎升级。该技术将重塑人机协作模式,使AI具备类人类的综合认知能力。
2025-11-13 23:06:27
658
原创 用51单片机 通过 K1/K2 控制 LED1/LED2,彻底搞懂“外部中断”
本文介绍了通过单片机实现按键控制LED的基础项目,主要讲解了中断机制的原理与应用。文章首先以生活实例类比中断概念,解释中断相比轮询的优势;随后详细说明下降沿触发的原理及按键电路设计要点。重点剖析了51单片机外部中断初始化必须配置的"三件套"(IT0/EX0/EA)的作用和相互关系,并给出完整代码实现。项目采用"中断置标志+主循环处理"的架构,确保响应及时又降低CPU占用。最后讨论了中断与轮询的选择场景,并展示了如何修改代码实现按键翻转LED状态。
2025-11-10 23:08:39
685
原创 借 Foo 类顺序执行问题,吃透 C++ 多线程核心知识点:互斥锁 / 条件变量 / 信号量 / 异步 / 原子操作
摘要:本文以C++多线程编程中的Foo类顺序执行问题为例,详细解析了五种同步机制的实现方式及其适用场景。通过互斥锁建立顺序依赖链,利用条件变量实现等待-通知机制,使用信号量控制执行权限,借助异步操作实现任务级同步,以及采用原子操作进行轻量级状态同步。文章强调不同同步机制的核心优势和适用边界,旨在帮助开发者根据具体场景灵活选择最佳方案,从"会用"到"理解"多线程同步技术。每种方法都配有具体代码实现和知识点总结,为解决多线程顺序控制问题提供了全面指导。
2025-11-04 17:11:21
669
原创 从 STC52 入门:手把手教你用软件操控硬件
本文以STC89C52单片机为例,介绍嵌入式开发的硬件控制原理。文章采用模块化讲解方式:首先解析LED控制的共阳极电路原理及其GPIO编程实现;然后讲解按键检测的消抖处理及电平读取方法;最后通过串口通信实现电脑与单片机的交互控制。三个模块完整呈现了"输入-处理-输出"的嵌入式开发流程。文中强调硬件原理与软件接口的对应关系,指出80%的问题源于硬件连接。该教程适合嵌入式新手理解基础硬件控制逻辑,为后续学习更复杂系统打下基础。
2025-11-03 23:20:37
1122
原创 TCP 通信入门:用 Linux Socket 代码实践推开网络编程大门
Linux网络通信编程:TCP与UDP实现指南 本文全面介绍了Linux系统下TCP和UDP网络通信的实现方法。首先讲解了Socket编程基础,包括Socket概念、工作原理及两种类型(TCPSocket和UDPSocket)的特点。针对TCP协议,详细解析了其面向连接、可靠传输等特性,以及三次握手和四次挥手过程,并提供了完整的TCP服务器/客户端代码实现示例。对于UDP协议,则重点阐述了其无连接、不可靠但高效的特点,以及广播/多播功能。文章还展示了如何通过面向对象方式封装Socket功能,提高代码复用性,
2025-10-27 11:58:32
912
原创 C++11 核心新特性:从语法重构到工程化实践
C++11作为现代C++的起点,通过多重创新显著提升了开发效率与安全性。核心特性包括:1)语法优化如auto类型推导和范围for循环,简化了复杂类型声明和容器遍历;2)智能指针体系(unique_ptr、shared_ptr、weak_ptr)基于RAII机制实现自动内存管理,有效防止内存泄漏;3)右值引用和移动语义优化资源管理,减少不必要的拷贝开销;4)Lambda表达式增强了STL算法的表达能力;5)标准线程库提供了跨平台的多线程支持。这些改进使C++在保持高性能的同时,显著提升了代码安全性和可维护性。
2025-10-22 23:14:06
1190
原创 网络常使用的命令--ping、netstat、pidof的基本使用
本文介绍了三个常用的网络检测命令:1. Ping命令用于检测网络连通性,通过"ping 网址"测试,可使用"-c"选项指定测试次数;2. netstat命令查看网络状态,配合-u/-t选项查看UDP/TCP服务,-a显示所有服务,-p关联进程信息,-n显示IP地址;3. pidof命令快速获取服务进程ID,便于后续操作。这些命令组合使用可以帮助用户有效监控和管理网络连接状态。
2025-07-08 19:39:43
383
原创 C++:开胃菜练习项目---定长内存池的实现以及测试
作为程序员(C/C++)我们知道申请内存使用的是malloc,malloc其实就是一个通用的大众货,什么场景下都可以用,但是什么场景下都可以用就意味着什么场景下都不会有很高的性能,下面我们就先来设计一个定长内存池做个开胃菜,当然这个定长内存池在我们后面的高并发内存池中也是有价值的,所以学习目的有两层:
2025-02-25 12:41:59
786
原创 C++:命名空间
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{} 中即为命名空间的成员。// N是命名空间的名字,一般开发中是用项目名字做命名空间名。// 命名空间中可以定义变量/函数/类型int val;
2025-02-22 20:27:04
313
原创 Linux操作系统:进程控制_进程的创建、终止、等待
我们先来理一个关系,我们在写C/C++程序时,我们的主函数main经常要返回一个值:0,这也叫做退出码。那为什么要返会0呢?返回100可以吗?上述一个这么简单的代码,我们返回值是0,打印出来的结果也是没问题的。ppid是我们的bash进程,我们之前已经讲过,从命令行启动的进程的父进程都是bash.那我们把返回值改成100会不会有问题呢?返回值依然是没问题的所以这又能说明什么呢?我们直接看一个命令:echo $?查看父进程bash获取到的最近一个进程的退出码这怎么有我们刚刚设定的返回值100。
2024-11-23 19:31:50
1028
1
原创 Linux操作系统:Linux内核进程调度队列_大O(1)调度算法
在运行队列里,CPU会给我们维护一个140队列的数组,虽然本质上是个数组,但是里面放的是一个一个进程的pid地址。我们目前所学的Linux系统,一般都是分时操作系统,主要讲究的是公平,所以在这个队列数组里,我们只有下标为100-139的位置可以用,为40个队列。看到这个40有没有很熟悉,我们在学习进程优先级队列时我们学到过,调整进程优先级时,nice值不能随便调整,它的范围为[-20,19],这使我们的优先级大小范围控制在了[60,99]。nice的范围同样是40个大小,那这两者之间有没有什么联系呢。
2024-11-19 18:27:00
896
原创 Linux操作系统:程序地址空间的第一讲:对程序地址空间的初步认识
在地址空间中,有着堆区、栈区等等被划分成一块一块的区域,那这是怎么划分的呢?地址空间的本质其实就是内核的一个struct结构体,名叫mm_struct,管理着各个区域的区域划分。内部有很多的属性表示strat,end的范围。那栈举例:因为地址空间由低到高,所以start指向下面低地,end指向高地址为了更加证实这一点,我们看一下内核数据结构 :划分的这段区域,我们是都可以使用的。
2024-11-16 19:40:29
1018
原创 Linux操作系统:详细认识命令行参数和环境变量与其在操作系统中的具体应用
不知道大家有没有过疑惑,我们一开始学习C语言就知道,我们写代码一定会写的一个主函数main只能有一个,并且这个main函数的参数还是可带可不带的,这就很让人疑惑,我们经常用的就是不带参数的场景,那带参数的main函数该如何用呢?
2024-11-13 17:34:14
827
原创 Liunx操作系统:对进程的优先级的详细讲解
这个概念与我们现实生活中遇到的优先级相同,那么在操作系统里,进程优先级就是指定进程获取某种资源的先后顺序。在CPU的正常工作中,操作系统要维护CPU的一个运行队列,我们的进程PCB以一个先进先出的方式挂起在CPU的运行队列里,等待CPU的调度,等时间片用完,CPU就会将这个进程剥离,换下一个进程进行调度。这样在CPU的运行队列里进行排队的方式就是获取CPU资源的先后顺序,在队列头部就是优先级较高的进程,在队列尾部就是优先级较低的进程。
2024-11-11 21:17:19
1178
原创 Linux操作系统:学习进程_了解并掌握进程的状态
对进程状态之间转换感到头疼,只听书本概念根本无法理解,死记硬背不是什么好的解决方法。只有进行底层操作去了解每一个进程状态,才能彻底弄清楚进程状态是如何转换的。
2024-11-08 19:45:32
1003
原创 Linux操作系统:学习进程_对进程概念的深入了解
在学校里学习到进程,听老师讲的似懂非懂,每天都有在接触着进程,但是对于课本上的知识理解起来又是格外的难,这篇博客,我用Linux操作系统举例,来带大家深入的理解一下进程,摆脱对这个问题的困扰。
2024-11-06 13:08:22
1228
原创 Linux操作系统:进入进程学习的前期铺垫__对操作系统的认识与理解
在我们购买手机或者笔记本时,我们表面上看到的只是有显示屏与键盘鼠标等外设组成的一台设备,但是,当我们开机时,会有短时间的动画显示,这时设备在进行的工作就是帮我们打开操作系统这个软件,来使我们间接对手机上的软件进行管理。
2024-11-03 15:03:08
935
原创 Linux操作系统:进入进程学习的前期铺垫__对冯诺依曼结构的认识与理解
为什么我们会选择内存做存储器,而不是其他的存储单元。就是因为内存便宜能被大众所接受,又能很好的提高计算机效率,以较高的性价比让群众买到效率高的计算机。 能很好的服务大众,这也就是冯诺依曼体系结构伟大的原因。
2024-10-30 19:05:28
1155
原创 Linux:在xshell中演示在没有图形化界面的情况下如何使用gdb工具对代码进行调试
gdb调试工具只是帮助我们找到bug所在,真正要去解决bug的还是我们。
2024-10-23 15:32:41
1041
原创 动态规划:17.简单多状态 dp 问题_买卖股票的最佳时机III_C++
我们在状态表示的时候,一般都会创建一个数组dp,也就是我们所说的dp表,我们要做的就是把每一个状态的值填入这个表内,最终这个表内的某一个值可能就是我们要返回的值。越学越深入,动态规划也是熟能生巧,在题目中没有明显给出的时候,我们就要凭借自己做题的经验来确定,所以就需要我们大量的做题。这里需要注意的是,我们为什么在买入到卖出时,需要买入状态交易次数减一的那次状态,因为我们。当我们填第一天结束时的状态时,我们需要第0天的状态,但是没有第0天,那么填表时就会越界。所以我们在这里不能初始化为-∞,可以初始化为。
2024-10-20 21:15:42
1065
原创 动态规划:16.简单多状态 dp 问题_买卖股票的最佳时机含手续费_C++
我们在状态表示的时候,一般都会创建一个数组dp,也就是我们所说的dp表,我们要做的就是把每一个状态的值填入这个表内,最终这个表内的某一个值可能就是我们要返回的值。我们dp表的大小比天数又多了一天,所以我们填表时从dp表的第二个位置开始填,其下标正对应天数,但是我们prices数组的下标并不对应,这里需要注意它的下标。越学越深入,动态规划也是熟能生巧,在题目中没有明显给出的时候,我们就要凭借自己做题的经验来确定,所以就需要我们大量的做题。这个就是状态转移方程,我们要做的,就是推出dp[i][j]等于什么。
2024-10-18 19:45:31
1100
原创 Linux:Linux中第一个小程序_进度条
在日常生活中,我们下载软件,文件,都会都一个进度显示,来告知我们的下载进度,接下来我们可以自己手搓一个进度条,在我们自己写扫雷、贪吃蛇等小游戏时,可以做一个游戏加载进度使用在手搓进度条之前,我们需要一些知识作为铺垫,这些知识大家或多说少会有了解,但是我为了让大家更好的了解,我会把这些知识再细讲一下,方便理解。
2024-10-16 19:06:20
1819
原创 动态规划:15.简单多状态 dp 问题_买卖股票的最佳时机含冷冻期_C++
我们在状态表示的时候,一般都会创建一个数组dp,也就是我们所说的dp表,我们要做的就是把每一个状态的值填入这个表内,最终这个表内的某一个值可能就是我们要返回的值。越学越深入,动态规划也是熟能生巧,在题目中没有明显给出的时候,我们就要凭借自己做题的经验来确定,所以就需要我们大量的做题。这里要注意,我们第一天的三种状态所需要对应的前一天的状态是没有的,所以我们为了填表正确,需要对第一天的三种状态进行是手动初始化。不讲什么复杂的,简单来说状态转移方程就是 dp[i][j]等于什么 dp[i][j]=?
2024-10-15 20:13:57
862
原创 C语言:在Visual Studio中使用C语言scanf输入%s出现的栈溢出问题
学了C++之后就很少使用C语言了,今天帮同学解答C语言问题,遇到了一个我以前没有遇到过的问题。
2024-10-14 20:22:17
684
1
原创 动态规划算法:14.简单多状态 dp 问题_粉刷房子_C++
例如:我们想把i位置涂刷成红色,那么我们直接用上一个房子(i-1)的蓝绿状态比较取最小值就可以知道哪种种状态花费最小,再加上涂刷该位置的花费cost[i][0],就是涂刷到该位置时的总最小花费dp[i][0]再求dp[1][0]dp[1][1]dp[1][2]时,状态转移方程会加上cost[0][0]、cost[0][1]、cost[0][2]我也不懂,我们慢慢来。我们需要对dp[0][0]、dp[0][1]、dp[0][2]三个位置初始化,防止越界,也使得在填后一个位置时,填表正确。
2024-10-14 16:19:00
899
原创 数据结构进阶:二叉搜索树_C++
1. map和set特性需要先铺垫二叉搜索树,而二叉搜索树也是一种树形结构2. 二叉搜索树的特性了解,有助于更好的理解map和set的特性3. 二叉树中部分面试题稍微有点难度,在前面讲解大家不容易接受,且时间长容易忘4. 有些OJ题使用C语言方式实现比较麻烦,比如有些地方要返回动态开辟的二维数组,非常麻 烦。
2024-10-09 21:29:05
1498
原创 C++中的多态(详细讲解)
多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了 Person。Person对象买票全价,Student对象买票半价。必须通过基类的指针或者引用调用虚函数被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写。
2024-09-29 20:24:43
3140
原创 动态规划算法:13.简单多状态 dp 问题_打家劫舍II_C++
我们在状态表示的时候,一般都会创建一个数组dp,也就是我们所说的dp表,我们要做的就是把每一个状态的值填入这个表内,最终这个表内的某一个值可能就是我们要返回的值。由题目可知,小偷不可以偷相邻的两个房间,并且题目告诉我们第一个房间是和第二个房间相连的,所以小偷偷完第一个房间,就不可以偷最后一个房间。我也不懂,我们慢慢来。我们分析的首尾两种状态是本道题的两种大状态,因为小偷只能这样做抉择,不然就会报警,所以说,我们最终的答案要要。第一个位置偷:偷1不偷2,并且不偷最后一个房间,所以左下标为2,右下标为n-2。
2024-09-27 20:54:05
1269
2
原创 动态规划算法:12.简单多状态 dp 问题_打家劫舍_C++
我们在状态表示的时候,一般都会创建一个数组dp,也就是我们所说的dp表,我们要做的就是把每一个状态的值填入这个表内,最终这个表内的某一个值可能就是我们要返回的值。分析问题的过程中把重复子问题抽象成我们的状态表示,这个更难理解,一切的基础都是我们先对动态规划算法熟练运用。越学越深入,动态规划也是熟能生巧,在题目中没有明显给出的时候,我们就要凭借自己做题的经验来确定,所以就需要我们大量的做题。这个就是状态转移方程,我们要做的,就是推出dp[i]等于什么。我们创建dp表就是为了把他填满,我们初始化是为了。
2024-09-27 19:55:15
905
原创 动态规划算法:11.简单多状态 dp 问题_按摩师_C++
我们在状态标识的时候,一般都会创建一个数组dp,也就是我们所说的dp表,我们要做的就是把每一个状态的值填入这个表内,最终这个表内的某一个值可能就是我们要返回的值。越学越深入,动态规划也是熟能生巧,在题目中没有明显给出的时候,我们就要凭借自己做题的经验来确定,所以就需要我们大量的做题。时,我们选择了第一个预约时长,根据状态转移方程中我们求f[0]就需要f[-1],但我们没有f[-1]这个值,这就是越界。由题目我们可知,我们两次选择的预约时间不能相邻,并且题目要求我们最后的结果(预约时长)达到最大。
2024-09-25 17:08:37
1247
原创 C++ 中的继承(详细讲解)
下面我们看到Person是父类,也称作基类。Student是子类,也称作派生类。实际上面的表格我们进行一下总结会发现,基类的私有成员在子类都是不可见。基类的其他成员在子类的访问方式 == Min(成员在基类的访问限定符,继承方式),public > protected > private。意思就是,我们拿基类成员的权限与派生类继承方式的权限作比较,基类的其他成员在子类的访问方式就是较小的那个权限方式。
2024-09-19 20:15:16
2328
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅