- 博客(61)
- 收藏
- 关注
原创 std::bind和lambda的使用
本文详细介绍了C++中std::bind和lambda表达式的用法。std::bind用于延迟函数调用,支持参数预填和成员函数绑定,需注意this指针和占位符的使用。Lambda作为匿名函数,通过捕获列表访问外部变量,需区分按值/引用捕获,特别注意引用捕获的生命周期问题。文章对比了两者差异,推荐优先使用lambda(更清晰、支持重载、优化更好),并总结了捕获方式的选择口诀,强调传出作用域时务必按值捕获局部变量以避免悬空引用。
2026-03-29 19:33:08
39
原创 基于CSAPP深刻理解编译链接过程
文章摘要 本文详细解析了C++程序从源代码到可执行文件的编译链接过程。首先通过示例代码展示了一个简单的swap函数和主程序,随后阐述了g++编译器驱动程序的四个关键阶段:预处理、编译、汇编和链接。重点分析了可重定位目标文件swap.o的ELF格式结构,包括其头部信息和各段(section)的组成与功能。通过readelf工具展示了文件内部的具体组织结构,如.text代码段、.data数据段等,并解释了这些段在程序运行时的作用。文章还区分了编译错误和链接错误的本质区别,为理解程序构建过程提供了系统性的视角。
2026-03-26 22:30:48
366
原创 深刻理解继承和多态
本文介绍了C++继承的核心概念:1)继承语法与初始化顺序,子类需先完整初始化父类;2)方法调用规则,包括覆盖(override)和隐藏(hide)的区别;3)对象赋值时的切片问题及指针/引用解决方案;4)生命周期管理中析构函数必须声明为虚函数以避免内存泄漏。重点阐述了子类对象赋值给父类对象时发生的切片现象,以及如何通过指针/引用实现多态。最后强调了基类析构函数虚函数化的必要性。
2026-03-18 20:52:49
355
原创 深刻理解HTTP
HTTP是超文本传输协议,用于规范客户端与服务器间的通信格式。HTTP报文分为请求和响应两类,包含请求行/状态行、头部字段、空行和正文。常见状态码如200(成功)、404(未找到)等指示请求结果。头部字段如Host指定域名,Content-Length标识正文长度。GET方法获取资源,Host字段确定目标服务器。HTTP版本从1.0短连接发展到1.1长连接,再到2.0多路复用和3.0采用QUIC协议,逐步提升传输效率。HTTP协议作为应用层标准,与底层TCP/IP配合完成网络通信。
2026-03-16 21:58:22
470
原创 muduo网络服务器项目篇:服务器模块设计
本文主要探讨了网络编程中的关键组件实现原理与优化策略。首先分析了日志宏中localtime线程不安全的原因及可重入函数的重要性,指出线程安全≠可重入。然后介绍了Buffer模块如何通过读写指针分区和内存整理解决TCP粘包问题。在Socket模块中解释了端口复用的必要性,并详细解析了非阻塞IO下recv/send的返回值含义。核心事件驱动层部分阐述了Channel作为中介的作用,以及Poller如何与epoll配合实现高效事件监控。最后介绍了时间轮算法如何以O(1)复杂度管理定时任务。全文通过多个技术难点解析
2026-03-14 22:28:32
437
原创 深度解读TCP原理,这篇文章能解决95%TCP相关的问题
本文深入解析了TCP协议的生产者-消费者模型与可靠传输机制。核心观点包括: TCP采用双缓冲区的生产者-消费者模型实现解耦,发送端和接收端各自维护内核缓冲区,通过流式处理消除数据包边界限制,应用层需自定义协议解决粘包问题。 TCP报头包含关键控制字段:端口号实现进程寻址,序列号和确认号保证有序传输,窗口大小实现流量控制,6位标志位管理连接状态,校验和确保数据完整性。 可靠性机制基于序列号排序去重、累计确认应答和动态超时重传,通过全双工通信保证双向可靠性,采用批量发送和确认提升传输效率。 内核通过动态采样RT
2026-03-02 21:42:00
1148
1
原创 五大IO模型和多路转接详解
摘要:本文通过钓鱼案例形象类比五种IO模型,重点解析了epoll的底层原理。阻塞IO和非阻塞轮询IO存在效率问题,而IO多路转接(如epoll)通过内核事件通知机制显著提升性能。epoll采用红黑树存储监控的fd,双向链表记录就绪事件,避免了select/poll的遍历开销。核心API包括epoll_create创建监控结构、epoll_ctl管理fd、epoll_wait获取就绪事件。真正的异步IO需由OS完成数据拷贝,其他模型在数据搬运阶段仍属同步。理解这些模型对开发高性能网络服务至关重要。
2026-03-02 15:54:24
643
原创 UDP原理和极简socket编程demo
本文介绍了UDP协议的核心概念和编程实现。主要内容包括:1)TCP/IP通信连接的五元组标识(源/目的IP和端口号、协议号);2)UDP报文结构(8字节头部)及其16位长度限制(最大64KB),需要应用层手动分包;3)UDP特点:面向数据报、无连接、不可靠;4)通过C++代码示例展示了UDP服务端和客户端的编程实现流程,包括socket创建、绑定、收发数据等关键步骤。文章提供了从协议原理到实际编程的完整UDP知识框架。
2026-02-11 21:00:25
539
原创 基于线程池从零实现TCP计算器网络服务
本文介绍了C++中封装线程安全工具的实现方法。第一部分封装了RAII风格的互斥锁,通过Mutex类管理原生锁资源,使用LockGuard类实现自动加解锁,避免了手动管理锁资源带来的死锁风险。第二部分封装了线程池,通过Thread类将C风格的线程接口转化为面向对象形式,利用静态成员函数作为跳板解决C与C++函数签名不匹配的问题。重点讲解了如何通过引用传递确保锁的有效性,以及如何通过this指针在静态函数中访问对象成员。这些封装提高了多线程编程的安全性和易用性,让编译器自动管理资源生命周期,减少了常见并发问题的
2026-02-05 22:44:13
814
原创 TCP Socket编程详解
本文介绍了一个TCP服务器的实现方案,主要包括两个核心类:InetAddr地址转换类和TcpServer服务器类。InetAddr类封装了网络字节序与主机字节序之间的转换,提供IP地址和端口的统一管理,支持从内核地址结构体构造和本地端口监听两种场景。TcpServer类实现了服务器核心功能,包括socket创建、bind绑定、listen监听和accept接受连接等网络操作流程,采用饭店迎宾员和服务员的比喻形象说明了监听套接字和服务套接字的分工。代码中通过日志模块记录关键操作状态,并处理了端口复用等细节问题
2026-02-04 18:04:02
630
原创 网络编程前你需要知道的网络基础知识
本文系统介绍了计算机网络的基本原理与传输流程。主要内容包括:1)网络发展史与协议定义,指出协议是双方认可的结构体;2)OSI七层模型与TCP/IP五层模型对比,解释分层协议解决异构系统通信、长距离传输和物理差异屏蔽的问题;3)网络传输流程分析,详细说明局域网内基于MAC地址的广播通信机制和跨网络传输时IP地址与MAC地址的协同工作方式,其中IP地址决定宏观路径而MAC地址负责微观传输;4)关键概念总结,包括路由器功能、数据封装与分用过程等。通过快递运输的类比,生动阐释了网络分层和地址转换机制。
2026-01-31 18:05:47
632
原创 基于生产者-消费者模型下的线程同步综述
文章摘要: 本文深入探讨了线程同步与互斥的区别及实现方式。互斥解决资源竞争问题,保证数据安全;同步解决执行时序问题,避免线程饥饿。通过厕所坑位和奶茶店出杯的生动例子,解释了生产者-消费者模型的321原则(3种关系、2个角色、1个交易场所)。重点分析了条件变量的使用,包括wait等待和signal唤醒机制,并提供了基于阻塞队列的生产者-消费者模型实现代码。文章还强调wait必须原子性地释放锁并进入等待,以及signal与broadcast的适用场景差异,最后通过RAII封装实现了自动资源管理。
2026-01-27 19:28:25
982
原创 基于抢票系统的线程互斥详解
本文展示了两种C++线程封装实现:版本一采用静态成员函数处理线程回调,支持线程创建、启动、停止、连接和分离操作;版本二引入模板支持参数传递。文章重点演示了使用版本一模拟火车票抢购场景,通过全局变量tickets实现多线程共享资源访问,每个线程循环检查剩余票数并模拟抢票过程。代码片段展示了线程初始化、票数递减及并发访问控制的基本实现,为理解多线程编程提供了实践案例。
2026-01-26 22:26:35
604
原创 线程概念和线程控制
线程概念与Linux实现 线程是进程内部的执行流,Linux内核中通过轻量级进程(LWP)实现线程。与传统进程不同,线程共享进程的地址空间、文件描述符等资源,但拥有独立的栈和寄存器上下文。Linux内核使用task_struct统一管理进程和线程,线程创建时通过clone()系统调用共享父进程资源,而非创建全新地址空间。这使得线程调度更高效,CPU只需处理独立的执行流task_struct。 线程控制与创建 使用pthread_create()创建线程时,需注意: 线程函数参数应为堆内存或全局变量,避免栈变
2026-01-24 22:50:49
1017
原创 分页式存储管理——内存高效管理的基石
分页机制与内存管理 分页机制通过将内存划分为固定大小的页框(通常4KB),解决了内存碎片问题。虚拟内存和物理内存被分割为相同大小的页和页框,通过页表建立映射关系,使程序看到的连续虚拟地址可以映射到离散的物理内存空间。 多级页表设计(如二级页表)减少了连续内存需求,通过页目录和二级页表的分层管理,将大页表拆分为多个小页表分散存储。地址转换过程由MMU硬件完成,通过CR3寄存器定位页目录,结合虚拟地址的高10位和中10位索引查找物理页框。 页表项包含关键控制位(如有效位、读写权限、脏位等),用于内存管理和访问控
2026-01-24 18:59:28
1023
原创 进程间通信之管道
进程间通信(IPC)核心机制 摘要:本文阐述了进程间通信(IPC)的基本原理和实现方式。重点分析了管道机制,包括匿名管道和命名管道的底层实现、使用场景及编程接口。通过父子进程通信示例展示了匿名管道的实际应用,并介绍了基于匿名管道的进程池设计方案。文章还详细讲解了管道文件描述符管理、读写特性等关键技术点,为理解操作系统进程通信机制提供了实践参考。 (148字) 核心要点: IPC通过内核共享资源实现进程间数据交换 匿名管道仅限亲缘进程通信,命名管道支持任意进程 管道本质是内核缓冲区,需合理管理文件描述符 进程
2026-01-20 18:46:49
841
原创 基于inode的文件系统
持久化存储演进与磁盘技术 摘要:本文系统梳理了持久化存储技术的发展历程,从远古石刻到现代磁盘技术。重点分析了机械硬盘的物理结构(盘片、磁头、磁头臂等)及其工作原理,详细解释了磁盘的存储层级(柱面、磁道、扇区)和CHS/LBA寻址方式。同时介绍了文件系统的基本概念,包括块设备、分区机制和inode数据结构。通过技术演进的分析,展现了存储设备如何从简单的数据保存发展到支持高效随机访问的现代存储系统。
2026-01-11 21:28:13
759
原创 进程控制详解
本文介绍了Linux进程控制的相关知识,主要包括进程创建和终止两个部分。在进程创建方面,详细讲解了fork函数的工作原理、写时拷贝机制以及fork的常见用法和失败原因。在进程终止部分,阐述了进程终止的本质、三种终止场景(正常成功、正常失败、异常终止),并具体说明了进程退出的方法(main返回、exit、_exit)和退出码的含义。文章通过代码示例和图示,清晰展示了父子进程的执行流程和内存管理机制,帮助读者深入理解Linux进程控制的核心概念。
2025-12-25 22:42:08
738
原创 Linux 进程底层拆解:从 “先描述再组织” 到 O (1) 调度,程序员必备 OS 知识
本文介绍了Linux系统中进程的基本概念、管理方式及相关操作。主要内容包括:1)进程本质是内核数据结构与程序代码数据的组合,内核通过PCB(进程控制块)进行管理;2)详细解析了PCB的内部结构,包括标识符、状态、优先级等核心属性;3)介绍了查看进程的三种方法:/proc文件系统、ps指令和top指令;4)深入讲解了fork函数的原理,通过代码示例展示了父子进程的数据独立性。文章通过理论讲解与实例演示相结合的方式,系统性地介绍了Linux进程管理的核心知识。
2025-12-21 20:34:27
590
原创 Linux常见工具使用
本文介绍了Makefile的基本结构和规则,通过一个简单的C++项目演示了Makefile的使用方法。主要内容包括: 项目结构:展示了一个包含add.h、add.cpp和main.cpp的简单C++项目 Makefile解析: 变量定义:使用SRC、OBJ、BIN变量管理源文件和目标文件 默认目标:定义可执行文件的生成规则 编译规则:使用模式规则将.cpp文件编译为.o文件 清理规则:使用.PHONY声明伪目标 构建过程: 详细解释了make命令的依赖推导过程 说明了目标文件和依赖文件的时间戳比较机制 演示
2025-12-17 22:17:34
793
原创 初识操作系统
本文介绍了冯诺依曼体系结构和操作系统的基本概念。冯诺依曼体系结构规定计算机由输入设备、输出设备、存储器和CPU组成,所有数据必须经过内存与CPU交互,这种设计通过内存作为高速缓存解决了外设与CPU效率不匹配的问题。操作系统作为中间层,向上为用户程序提供简单接口,向下统一管理硬件资源,其核心思想是"先描述,再组织",通过封装系统功能和抽象硬件操作,使整个系统有序运行。文章还通过实例说明了数据在冯诺依曼体系中的流动过程。
2025-12-17 21:00:51
880
原创 g++演示如何从C++代码到可执行程序
本文介绍了C++代码从编写到生成可执行文件的完整编译过程。文章通过示例代码演示了预处理、编译、汇编和链接四个关键阶段:预处理阶段处理宏替换和头文件展开;编译阶段进行语法分析、语义检查和模板实例化;汇编阶段生成机器码目标文件;最后链接阶段合并目标文件并解析符号依赖。文中特别强调了模板实例化的时机、符号表的作用以及重定位信息的重要性,并通过实际命令操作展示了每个阶段的输出结果,帮助读者直观理解C++程序的编译流程。
2025-12-14 18:52:24
1045
原创 别再为博客图片失效抓狂!Gitee+PicList,永久免费的解决方案
本文介绍了Linux系统中文件和目录的基本操作。首先阐述了Linux树状目录结构的特点,然后详细讲解了创建目录(mkdir)和文件(touch)的方法,包括递归创建目录(-p选项)和修改文件时间属性。接着演示了文件内容的写入与读取操作,重点讲解了echo、printf、cat等命令以及输出重定向(>和>>)的使用。最后介绍了删除文件(rm)的注意事项,强调递归删除(-r)和强制删除(-f)选项的危险性,特别是警告不要使用rm -rf /命令。文章通过具体命令示例展示了每个操作的实际效果,帮
2025-12-05 19:46:18
1178
1
原创 Linux常见指令
本文介绍了Linux文件系统的基本操作,包括目录和文件的创建、修改、删除以及内容读写。主要内容有: 目录操作:使用mkdir命令创建目录,-p选项可递归创建多级目录结构 文件操作: touch命令创建空文件或修改文件时间属性 echo和printf命令写入内容,配合重定向符号>和>>实现覆盖或追加写入 cat和tac命令查看文件内容,支持正序和逆序显示 文件系统特性:Linux采用树状目录结构,所有文件以根目录/为起点,并遵循"一切皆文件"的理念 文章通过具体命令示例演
2025-12-05 19:42:11
876
1
原创 C++ 内存安全双保险:异常处理 + 智能指针,彻底跟内存泄漏说 “再见”
本文介绍了C++异常处理机制,主要包括以下内容: C传统错误处理方式的局限性:终止程序或返回错误码存在用户体验差和繁琐的问题。 C++异常概念:通过throw抛出异常,catch捕获异常,try包裹可能出错的代码。 异常匹配原则: 抛出对象类型决定匹配的catch块 异常沿调用链向上传播,由最近的匹配catch处理 异常对象会被拷贝到catch块中 catch(...)可捕获所有类型异常 异常栈展开过程:从抛出位置开始,沿调用栈向上查找匹配catch块,直到main函数仍未匹配则程序终止。 异常重新抛出机制
2025-11-28 16:22:46
754
1
原创 别再只懂 C++98!C++11 这7个核心特性,直接拉开你与普通开发者的差距
本文介绍了C++11中的初始化方式、声明方式和右值引用相关内容。主要内容包括: 初始化方式: 扩展了{}初始化范围,可用于所有内置和自定义类型 介绍了std::initializer_list的实现原理和使用方法 声明方式: auto关键字实现类型自动推断 decltype获取表达式类型 右值引用: 区分左值和右值 左值引用和右值引用的区别 右值引用的应用场景,通过move语义减少拷贝开销 文章通过代码示例展示了这些新特性的具体用法,帮助理解C++11在语言层面所做的改进。
2025-11-28 16:16:32
1410
2
原创 O (1) 查找神技!哈希表核心玩法全解析,闭散列 + 开散列实战代码直接抄
本文介绍了哈希表的基本概念及实现方法。哈希表通过哈希函数建立元素与存储位置的映射关系,实现高效查找(O(1)时间复杂度)。主要内容包括:1)哈希冲突的概念及原因;2)常用哈希函数如直接定址法和除留余数法;3)两种解决冲突的方法 - 闭散列(线性探测)和开散列(链地址法),并给出具体实现代码。重点分析了扩容机制,当负载因子超过0.7时需要扩容重建哈希表。哈希表通过空间换时间的策略,大幅提升了查找效率。
2025-11-15 22:41:16
755
9
原创 踩爆 8 个坑后,我悟了!unordered_map 底层封装的正确姿势(代码可直接抄)
本文介绍了如何从基础的KV模型哈希表逐步改造为支持泛型T的哈希桶,最终封装成unordered_map和unordered_set。主要步骤包括:1) 将节点从pair<K,V>抽象为泛型T;2) 引入KeyOfT策略类从T中提取key;3) 实现通用哈希桶HashTable<K,T,KeyOfT,Hash>;4) 添加迭代器支持;5) 封装具体容器类。文章特别指出了实现过程中的常见错误,如节点类型使用不当等。通过这种分层设计,可以复用同一套哈希桶实现来支持不同的关联容器需求。
2025-11-15 22:40:41
1196
3
原创 不再死记!红黑树默认红色的原理 + LL/RR/LR/RL 全图解
红黑树是一种自平衡二叉搜索树,通过节点颜色(红/黑)和旋转操作维护平衡。本文介绍了红黑树的基本概念、性质(根黑、无连续红、路径同黑数),对比了AVL树与BST的差异,突出了红黑树在插入删除效率上的优势。详细解析了插入操作的实现逻辑:新节点默认红色,若父节点为红则需调整,分"叔叔红"(变色)和"叔叔黑"(旋转+变色)两种情况处理,并给出LL/RR/LR/RL四种旋转场景的图示与代码实现。文中附有节点定义示例和完整插入代码,强调红黑树通过适度放宽平衡条件换取更高操作效率的
2025-11-01 19:53:48
1935
23
原创 别再让搜索树变竹竿!AVL 旋转四连招详解!
摘要:AVL树是一种自平衡二叉搜索树,通过平衡因子(右子树高度-左子树高度)确保每个节点平衡因子的绝对值≤1。当插入或删除导致树失衡(平衡因子为±2)时,通过旋转操作(右旋、左旋等)恢复平衡。文章详细分析了AVL树的结构定义、插入逻辑以及旋转操作(以右旋为例),展示了如何通过调整子树高度保持高效操作性能,解决普通二叉搜索树退化为链表的问题,实现O(logn)的时间复杂度。
2025-10-30 20:00:53
974
49
原创 初学二叉搜索树踩坑多?C++ 从原理到代码,搞定增删查全流程
本文介绍了二叉搜索树的基本概念和操作实现。二叉搜索树满足左子树节点值小于根节点值,右子树节点值大于根节点值的特性。文章详细讲解了查找、插入和删除三种核心操作:查找采用二分思想,时间复杂度为O(logn);插入需找到合适位置并保持树结构;删除则根据节点子节点数量分为三种情况处理,重点阐释了删除有两个子节点时的替换策略。通过C++代码示例展示了二叉搜索树类的具体实现方法,包括节点结构定义和各类操作的算法流程。
2025-10-27 13:11:16
1868
52
原创 “码”上认亲!面向对象之多态:一脉相承的「同名不同用」
文章摘要:本文介绍了C++多态的概念及实现方式。通过虚函数机制,可以让不同类型的对象执行相同行为时产生不同结果。重点讲解了基类析构函数声明为虚函数的重要性,以避免内存泄漏问题。同时介绍了C++11引入的override和final关键字,用于确保正确重写虚函数或禁止重写。文章还分析了多态的实现条件,包括基类虚函数重写、基类指针或引用调用虚函数等关键点。
2025-10-23 16:01:19
752
15
原创 “码” 上认亲!面向对象之继承:解锁代码的 “家族传承” 密码
本文介绍了C++中继承的基础知识,主要包含以下内容: 继承的定义:继承是面向对象程序设计中实现代码复用的重要手段,允许在保持原有类特性的基础上进行扩展。 继承语法:通过示例展示了鱼类基类(Fish)和派生类(Carp、Tuna)的实现方式,解释了protected限定符的作用。 基类初始化:演示了如何使用派生类构造函数通过初始化列表向基类传递参数。 方法覆盖:说明如何在派生类中覆盖基类方法,并提供了畜牧业动物类的示例。 显式调用:介绍了如何在派生类中通过作用域限定符显式调用基类方法。 文章通过多个具体代码示
2025-10-20 17:23:06
929
51
原创 别再被模板折磨了:非类型参数 + 特化 + 分离编译一网打尽
本文介绍了C++模板中的非类型模板参数和模板特化两大特性。非类型模板参数允许将编译期确定的值作为模板参数,常用于静态数组大小配置,如std::array<T,N>的实现。模板特化则针对特定类型提供定制化实现,包括函数模板特化(需保持参数类型一致)和类模板特化(分全特化和偏特化)。全特化完全指定所有模板参数,偏特化可针对参数组合(如指针类型或固定部分参数)进行特化处理。通过特化能解决特殊类型场景下的问题,如指针比较的误判情况。文中通过日期类比较、类模板特化等示例代码,直观展示了这些特性的应用场景和
2025-10-14 12:46:35
1001
20
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅