自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux网络编程:彻底理解IO多路复用select!从fd_set位图、读写就绪到手写TCP多客户端字典服务器

在前面的Linux网络编程中,我们已经学习了五种经典I/O模型:其中,我们通过 配合:将文件描述符设置为非阻塞模式。例如:这样,在没有数据可读时:可以立即返回:并设置:而不需要让当前线程一直阻塞等待。但是,这又引出了一个新的问题。假设我们的TCP服务器同时连接了100个客户端:如果使用简单的非阻塞轮询:服务器就需要不断检查这些Socket。即使其中99个客户端都没有发送任何数据,服务器仍然可能反复调用它们对应的 。显然,这种方式可能产生大量无意义的系统调用。我们真正希望实现的是:能不能让内核

2026-11-05 14:34:03 263 6

原创 Linux网络编程:彻底理解五种I/O模型!从阻塞IO、非阻塞IO到IO多路复用,带你掌握fcntl与O_NONBLOCK

在前面的Linux网络编程中,我们已经学习了TCP与UDP,并且能够使用Socket完成基本的数据收发。这个函数可以从Socket中读取数据。如果客户端一直没有发送数据,服务器执行recv()会发生什么?对于默认的阻塞Socket,服务器可能会一直等待。服务器调用recv()v内核接收缓冲区没有数据v服务器线程进入等待状态v客户端发送数据v内核接收到数据vrecv()返回如果服务器同时需要处理100个客户端呢?客户端1 → 一个线程等待recv()

2026-11-05 10:14:55 171 1

原创 Linux网络编程:彻底理解NAT、正向代理、反向代理与内网穿透!从地址转换到UDP打洞原理

TCP与UDP的传输机制。IPv4地址、子网划分与路由。MAC地址、以太网帧与ARP协议。数据包如何从源主机经过多个路由器,最终到达目标主机。但是,实际网络中还存在几个非常常见的问题。电脑A:192.168.1.10电脑B:192.168.1.11手机C:192.168.1.12它们都使用私有IP地址。为什么三台设备都可以访问互联网?我们可以在家里正常访问这个服务器。为什么?NAT正向代理反向代理SOCKS5VPN内网穿透UDP打洞让原本不方便直接通信的网络设备进行通信。

2026-11-04 08:37:50 221 9

原创 Linux网络编程:彻底理解数据链路层!从以太网帧、MAC地址、MTU到ARP地址解析与逐跳传输

TCP:提供可靠、有序的字节流传输。UDP:提供无连接的数据报传输。IP:负责网络层的寻址与数据报转发。数据应该从哪台主机出发,最终到达哪台主机?源IP:192.168.1.10目标IP:192.168.3.20主机Av路由器R1v路由器R2v主机B主机A希望把数据发送给主机B数据报究竟是怎样从主机A发送到路由器R1,再从R1发送到R2的?IP地址能够描述网络层的源与目标,却不能代替每条实际链路上的传输规则。主机A → 路由器R1这一段通信需要有相应的数据封装格式和链路层寻址方式。

2026-11-03 11:48:39 405 12

原创 Linux网络编程:彻底理解IP协议与网络层!从IPv4报头、子网划分、CIDR到NAT、路由表与逐跳转发

TCP:面向连接,提供可靠、有序的字节流传输。UDP:无连接,面向数据报,不提供可靠有序的传输保证。TCP和UDP究竟是怎样把数据发送到另一台主机上的?主机A:192.168.1.10主机B:192.168.3.20它们不在同一个局域网中。路由器A路由器B路由器C……主机A怎样知道应该把数据交给哪个路由器?路由器收到数据以后,为什么知道下一步应该发往哪里?全世界存在大量主机,为什么不需要在每一台路由器中保存所有主机的完整信息?

2026-11-02 09:47:48 430 12

原创 Linux网络编程:彻底理解TCP协议!从报文结构、三次握手、四次挥手到滑动窗口、流量控制与拥塞控制

在前面的Linux网络编程中,我们已经学习了UDP协议。无连接不可靠面向数据报UDP协议的报头只有8字节,结构相对简单。但是,在实际网络通信中,很多应用需要保证数据能够可靠、有序地传输。文件传输远程登录数据库通信HTTP/1.1电子邮件假设客户端需要向服务器发送一个文件。客户端 服务器数据1 -----------------------> 收到数据2 ---------X 丢失数据3 -----------------------> 收到那么服务器最终得到的数据就不完整。

2026-11-01 23:27:02 214 10

原创 Linux网络编程:彻底理解UDP协议!从端口号、五元组、8字节报头到手写UDP服务器

socket()bind()sendto()recvfrom()等接口,并编写过简单的UDP通信程序。hello为什么UDP服务器需要绑定端口号?为什么一台主机能够同时运行多个网络程序?为什么UDP不需要建立连接就能发送消息?为什么UDP不能保证数据一定到达?为什么UDP发送一次100字节的数据,不能用10次10字节的接收操作把它依次取出来?为什么说UDP没有TCP那样的发送缓冲机制,却仍然可以进行全双工通信?UDP一个数据报究竟能够传输多少字节?

2026-11-01 18:05:40 663 6

原创 Linux网络编程:一文彻底理解HTTP协议!从URL、请求响应、GET/POST、状态码到手写HTTP服务器

在前面的Linux网络编程中,我们已经学习了TCP Socket,并通过网络计算器理解了应用层协议的设计过程。当时我们约定:请求包含哪些字段。响应包含哪些字段。数据如何序列化和反序列化。如何识别完整报文。服务器如何返回计算结果与错误状态。应用层协议本质上就是通信双方对消息格式、字段含义和交互行为达成的约定。既然我们能够设计自己的应用层协议,那么是否已经存在被广泛使用的成熟协议,供我们直接使用?当然存在。

2026-10-31 09:49:19 186 5

原创 Linux网络编程:从零设计应用层协议!Jsoncpp序列化、Encode/Decode拆包与TCP网络计算器完整实现

在上一篇中,我们已经明确了应用层协议的基本含义,并且通过网络计算器设计了两个结构:表示客户端请求。表示服务器响应。同时完成了:抽象基类和:具体实现类。现在客户端已经能够:但是还没有解决两个重要问题。第一个问题:怎样把Request与Response转换成适合网络传输的数据?例如:需要转换为:服务器收到以后,再恢复原来的字段。这需要:第二个问题:怎样从TCP字节流中识别一条完整的请求?即使客户端一次发送了完整JSON,服务器也不一定能通过一次 读取完整。因此,还需要:对应:一、先设计整

2026-10-30 14:00:36 562 13

原创 Linux网络编程:应用层协议究竟是什么?从网络计算器到TCP Socket抽象基类完整实现

socket()bind()listen()accept()connect()recv()send()并且能够实现简单的Echo Server。hello这个程序已经可以完成基本的网络通信。但是,如果希望服务器不只是原样返回客户端的数据,而是能够完成实际的计算任务呢?客户端:100 + 200服务器:300客户端应该怎样描述计算请求?服务器应该怎样理解两个操作数和运算符?服务器应该返回哪些信息?如何把C++对象转换成适合网络传输的数据?

2026-10-30 08:53:20 249 8

原创 Linux Socket TCP编程(二):逐文件重构多进程、多线程与线程池服务器,深入fork、pthread_create、popen和std::bind

在上一篇中,我们按照完整的工程设计流程,实现了V1单进程TCP Echo Server。NoCopy.hppComm.hppTcpIO.hppMakefileTcpServer负责。负责。负责。第一个客户端始终占用服务器的主执行流,使后续客户端不能及时获得应用层服务。socket()bind()listen()accept()这些基础接口。一条客户端连接交给谁处理,以及怎样管理相应的进程、线程和Socket资源。V2:多进程TCP服务器↓V3:多线程TCP服务器↓。

2026-10-29 14:14:25 403 4

原创 Linux Socket TCP编程(一):从项目设计到完整实现,深入socket、bind、listen、accept与单进程Echo Server

socket()bind()recvfrom()sendto()但 TCP 是面向连接的传输协议,编程流程与 UDP 不完全相同。如果我们要编写一个 TCP Echo Server,不能只知道几个系统调用的名字,就立即开始编写代码。明确项目需求↓划分文件职责↓设计类和函数接口↓完成各文件实现↓编译运行↓分析执行流程与局限因此,本文不仅介绍 TCP Socket API,还将从工程设计出发,完整实现一个可以编译运行的 TCP 回显服务器与客户端。TCP通信流程↓。

2026-10-27 20:31:38 407 12

原创 Linux Socket UDP编程(二):从零实现多人聊天室,深入Route消息转发、线程池、UDP全双工与inet_ntoa线程安全

vvUdpSocket通用封装客户端A发送hellov服务器收到hellov服务器回复hello给客户端A客户端A发送applev服务器查询字典v服务器回复苹果给客户端A前面两个程序都属于典型的请求—响应模式。客户端发送请求,服务器完成处理,然后将结果返回给原来的客户端。但如果我们希望实现一个多人聊天室,情况就不同了。Client-A发送:大家好Client-A收到:大家好Client-B收到:大家好Client-C收到:大家好那么服务器就不能只回复消息的发送方。

2026-10-26 22:05:33 108 6

原创 Linux Socket UDP编程(一):手写UDP回显服务器与客户端,从socket、bind、recvfrom到网络字典服务器完整实战

应用层传输层网络层数据链路层物理层同时也知道,网络通信需要使用 IP 地址和端口号等信息定位通信端点。服务器IP:192.168.1.10服务器Port:8888如何编写一个 Linux 程序,让另一台计算机可以向它发送消息,并接收服务器返回的结果?Linux 提供了 Socket 编程接口。通过这些接口,应用程序可以使用操作系统已经实现的网络协议栈,而不需要自己编写完整的 IP 和 UDP 协议。vvV2:通用UDP Socket封装。

2026-10-25 17:23:40 817 8

原创 Linux线程同步与互斥:彻底理解读者写者问题、读写锁原理、读者优先与写者优先(附pthread完整实验)

通过互斥锁,可以确保多个线程不会同时进入需要排他访问的临界区。如果多个线程需要修改这种做法解决了多线程并发修改共享数据的安全问题。假设一个共享数据被读取的次数非常多,而修改次数非常少。多个线程查询系统配置信息。多个线程读取一份共享的数据表。多个线程查询某个缓存中的数据。偶尔有线程负责更新这些数据。多个线程同时修改共享数据可能发生数据竞争。但如果多个线程只读取同一份数据,并且没有线程正在修改它,还需要禁止这些读线程同时执行吗?显然不一定。

2026-10-24 17:33:52 497 6

原创 Linux网络编程基础(二):彻底理解局域网通信、MAC与IP地址、数据封装、端口号、网络字节序及Socket接口

计算机之间需要交换数据v通信双方需要共同的协议v复杂协议采用分层设计vTCP/IP协议族应用层传输层网络层数据链路层物理层计算机A发送的一条消息,究竟怎样到达计算机B?计算机A发送:"你好"计算机B接收:"你好"如果两台计算机在同一个局域网中,怎样识别目标设备?为什么网卡需要 MAC 地址?为什么应用数据必须经过多层协议处理?什么是报头、有效载荷、封装和解包?如果通信双方位于不同网络中,路由器怎样进行转发?已经知道目标计算机的 IP 地址,为什么还需要端口号?

2026-10-24 14:28:42 876 8

原创 Linux网络编程基础(一):从计算机网络发展、通信协议到OSI七层与TCP/IP分层模型

在学习 Linux 系统编程时,我们已经接触过进程、线程、文件 IO 和进程间通信等内容。例如,可以通过管道让两个进程交换数据,也可以通过共享内存让不同进程访问同一块内存区域。但是,这些实验主要发生在同一台计算机内部。程序 A 运行在计算机 A 上。程序 B 运行在计算机 B 上。它们不属于同一台主机,却需要相互交换数据。那么,计算机 A 怎样把数据发送到计算机 B?两台计算机如何识别对方发送的数据?如果中间存在交换机、路由器,又应该由谁负责数据转发?这些问题都需要计算机网络来解决。

2026-10-23 17:42:24 705 10

原创 Linux线程同步与互斥(二):从日志系统与线程池设计,到线程安全单例、可重入函数和死锁原理

上一篇已经掌握了线程互斥和同步的基本方法。保护临界资源。协调线程之间的执行条件。sem_wait()sem_post()实现了基于固定容量环形队列的生产者—消费者模型。但是,到目前为止,我们的大部分程序仍然只是简单实验。生产者产生整数v阻塞队列v消费者打印整数如果进一步将队列中的整数替换成任务对象,再提前创建多个工作线程,就能够逐步实现一个线程池。多个工作线程怎样安全取得任务?没有任务时,怎样让工作线程等待?有新任务到来时,怎样唤醒工作线程?程序运行时产生的日志怎样保存。

2026-10-22 20:49:24 337 2

原创 Linux线程同步与互斥(一):从抢票系统到Mutex、条件变量、阻塞队列与POSIX信号量

我们知道,同一进程中的多个线程拥有独立的执行流,但共享进程的地址空间。如果这是一个全局变量,那么进程中的多个线程都可以访问它。假设有100张票,让4个线程同时卖票,能不能保证恰好卖出100张?tickets--;似乎就能完成任务。但实际运行时,可能出现重复卖票、票数变成负数等问题。多个线程能够共享同一份数据,不代表它们能够安全地并发修改这份数据。解决多个线程同时访问临界资源时的安全问题。在保证数据安全的前提下,让线程按照适当的条件和顺序协作。

2026-10-21 14:34:49 298 8

原创 Linux线程控制详解:pthread创建、终止、等待、分离与NPTL源码分析,深入理解LWP和clone

在上一篇文章中,先学习了:然后重新理解了进程与线程之间的关系。我们知道:进程是资源分配的基本单位,线程是调度的基本单位。同一进程中的线程能够共享:同时具有各自的:但到这里,我们还没有真正创建过线程。在 Linux 中:这里,按照线程创建、线程终止、线程等待、线程分离、线程 ID 与地址空间布局、线程封装、历史 NPTL 源码分析的顺序展开。之前创建进程时,我们使用:而在线程编程中,我们需要另外一组接口。Linux 用户程序通常可以通过 POSIX Threads(简称 Pthreads)接口创建和控

2026-10-19 08:34:38 185 6

原创 Linux线程概念详解:从分页存储、页表、MMU与TLB,深入理解线程和进程的区别与联系

fork()exec()waitpid()也了解了进程的基本概念。进程是一个正在执行的程序。但是,一个进程内部是否只能存在一条执行路线?接收用户输入。执行计算任务。等待文件 IO。更新程序状态。如果每项任务都创建一个新进程,是否会产生额外的资源开销?能否在同一个进程内部,让多条执行路线共同使用已经分配好的资源?线程(Thread)。课件给出了一个定义:在一个程序里的一个执行路线,就叫做线程。线程是进程内部的一条控制序列,也就是一条执行流。进程A+-- 执行流1。

2026-10-17 13:11:37 720 4

原创 Linux进程信号(二):深入理解信号阻塞、未决、sigaction、中断机制、可重入函数与SIGCHLD

在上一篇《Linux进程信号(一)》中,我们已经学习了 Linux 信号的基本概念与常见产生方式。可以向指定进程发送SIGINT。可以主动产生信号。alarm(1);可以请求操作系统在定时器到期后产生SIGALRM。信号是怎样产生的?如果信号产生后没有立即得到处理,它会保存在什么地方?什么叫信号未决(Pending)?信号阻塞(Block)和忽略(Ignore)有什么区别?操作系统怎样决定什么时候调用信号处理函数?为什么信号处理函数可以打断当前正在执行的用户代码?

2026-10-14 13:13:39 639 11

原创 Linux进程信号(一):从Ctrl+C到kill、raise、alarm,深入理解信号的概念与产生原理

fork()wait()waitpid()execvp()进程间通信:匿名管道、命名管道、共享内存等通过这些知识,我们已经可以创建进程、控制程序执行,并让多个进程进行数据交换。如果一个进程正在执行某项工作,操作系统或者其他进程希望通知它发生了某个事件,该怎么办?Ctrl+C结束程序。为什么按下Ctrl+C就能够终止进程?Ctrl+C与操作系统内核之间是什么关系?如果进程正在执行其他代码,是否必须立即处理这个事件?能不能让进程收到Ctrl+C后不退出?

2026-10-14 12:46:42 237 6

原创 Linux进程间通信(二):深入理解System V共享内存、消息队列、信号量与内核IPC资源管理

pipe()mkfifo()还通过匿名管道实现了简单进程池。我们已经知道,两个进程可以借助内核管道交换数据。进程A写入管道v内核管道缓冲区v进程B读取管道这种设计简单、实用,但是还有一些问题。如果两个进程需要频繁交换大量数据,是否有更直接的通信方式?如果我们希望区分不同类型的消息,该怎么办?如果多个进程同时访问同一份数据,怎样避免发生冲突?进程退出后,操作系统是否会自动清除全部 IPC 资源?内核究竟如何管理多个进程共同使用的 IPC 对象?

2026-10-13 12:14:44 444 3

原创 Linux进程间通信(一):从匿名管道、命名管道到进程池,深入理解Pipe、FIFO与文件描述符

fork()execvp()waitpid()并且利用这些接口实现了一个简单的 MiniShell。我们知道,fork()能够创建子进程,execvp()可以将子进程的程序映像替换成其他程序。父进程和子进程能不能直接交换数据?ls | wc -lls负责输出当前目录下的文件名,而wc -l负责统计输入数据的行数。两个程序分别运行在不同进程中,却能够完成协作。进程间通信(Inter-Process Communication,IPC)。认识进程间通信的目的与分类。

2026-10-13 11:05:58 558 11

原创 Linux库的底层原理:ELF文件格式、静态链接、程序加载、虚拟地址空间与GOT/PLT详解

在上一篇文章中,我们已经掌握了静态库和动态库的制作与使用。完成链接。但是,如果只掌握这些命令,我们还不能真正理解链接器和操作系统到底完成了什么。为什么分别编译的两个.o文件能够调用彼此的函数?链接器如何知道某个函数的机器指令位于哪里?为什么.o.so和可执行文件都可以采用 ELF 格式?程序尚未运行时,为什么 ELF 文件中已经存在虚拟地址?操作系统执行execve()时,究竟怎样把 ELF 文件装载到进程地址空间?动态库加载位置不固定,程序为什么仍然能够正确调用其中的函数?

2026-10-12 09:45:22 427 6

原创 Linux动静态库详解:从代码封装到静态库.a、动态库.so的制作、链接与使用

在前面的 Linux 学习中,我们已经实现过一些独立程序,例如 MiniShell,以及对open()read()write()等系统调用的简单封装。最直接的办法当然是把对应源码复制到三个项目中。代码重复。不同项目保存了相同功能的实现。维护困难。修复一个 Bug 后,需要同步修改所有项目。模块化程度低。使用者需要关心功能的具体实现。不方便交付。我们可能只想提供功能接口,不想提供全部源代码。因此,我们需要一种机制,将已经完成的功能封装起来,让其他程序直接使用。这就是库(Library)。

2026-10-12 08:51:43 595 12

原创 Linux文件系统万字详解:从磁盘CHS/LBA寻址到Ext2块组、inode、路径解析、挂载与软硬链接

在上一篇 Linux 基础 IO 中,我们已经学习了文件描述符fdopen()read()write()close()和重定向。操作系统会找到对应的文件,并且返回一个文件描述符。读取文件内容。操作系统为什么能够根据文件名找到文件?文件内容存储在磁盘的什么位置?文件的权限、大小、时间等属性保存在哪里?为什么文件描述符和 inode 不是一回事?为什么 Linux 可以将多个磁盘分区统一组织在根目录下?为什么删除文件名以后,文件数据不一定立刻消失?

2026-10-11 18:59:02 480 9

原创 Linux基础IO万字详解:从文件描述符fd到重定向、FILE缓冲机制及MiniShell升级

在前面的 Linux 进程控制学习中,我们已经通过 、 和 实现了一个简易 Shell。目前,我们的 MiniShell 已经能够完成:例如:但是,如果尝试执行:我们之前的程序就无法正确处理。真正的 Shell 会将 写入 ,而不是显示在终端上。这便引出了一个重要问题:程序默认向显示器输出数据,操作系统究竟怎样把这些数据转移到文件中?要回答这个问题,我们首先需要理解 Linux 文件 IO 的底层机制。本篇文章将按照下面的顺序展开:本文重点解决三个问题:从最直观的角度理解,文件就是保存在磁盘等存储

2026-10-10 15:21:11 242 25

原创 Linux进程控制详解:从fork、进程退出、waitpid到exec程序替换与简易Shell实现

进程是程序的一次执行实例。Linux 使用描述和管理进程。每个进程都有自己的 PID、地址空间和执行上下文。操作系统通过调度器决定进程什么时候运行。进程可能处于运行、睡眠、停止和僵尸等状态。进程是谁创建出来的?执行完以后又由谁负责回收?如果一个进程想运行另外一个程序,应该怎么办?ls -lShell 会运行ls程序,等待执行结果,再重新显示命令提示符。Shell进程| fork()v创建子进程| exec()v运行ls程序| exit()v子进程退出v。

2026-10-09 09:44:28 234 15

原创 Linux进程基础(二):进程调度、上下文切换、O(1)调度器、环境变量与虚拟地址空间

Process AProcess BProcess C...Process N8个CPU核心1个CPU下一个运行谁?运行多久?优先级不同怎么办?进程睡眠以后怎么办?时间片用完以后怎么办?进程调度Scheduling这里的n指的是需要参与选择的可运行任务数,而不是 CPU 核心数,也不是系统里所有处于睡眠状态的进程总数。如果算法最多需要检查nTnanbOnTnanbOn其中a是每次检查的操作成本,b是固定开销。当 n 增大时,操作量如何增长?

2026-10-08 13:13:25 854 25

原创 Linux进程基础(一):从操作系统管理到PCB、fork、进程状态、僵尸与孤儿进程

fork();getpid();getppid();一堆Linux命令几个系统调用操作系统如何管理正在运行的程序?冯诺依曼体系↓计算机硬件↓操作系统管理硬件↓操作系统管理程序↓描述进程↓↓组织进程↓调度、切换、创建、退出用户↓应用程序↓C/C++库↓系统调用接口↓│ 操作系统内核 │↓ ↓ ↓CPU 内存 外设也就是常见定义:进程是程序的一次执行实例。或者:进程是正在执行的程序。这两个说法都可以帮助入门。退出码退出原因资源使用统计。

2026-10-06 20:49:05 278 30

原创 Linux开发工具详解(二):Git版本控制、GitHub协作与GDB调试实战

第一次能运行第二次加功能第三次改接口第四次修Bug第五次重构project-v1project-v2project-v3project-真最终版哪个版本改了什么?什么时候改的?谁改的?还能不能回去?两个人怎么同时开发?版本控制系统谁在什么时候修改了哪些文件具体改了什么为什么修改查看历史回退版本创建分支合并代码多人协作GDB更方便查看源码的终端界面listCGDBbreakrunnextstepprintwatchbtVSVSCodeCLionGDB。

2026-10-04 15:16:57 800 16

原创 Linux开发工具详解(一):软件包管理、Vim、GCC/G++、Makefile与进度条实战

写代码↓点一下运行↓得到结果IDE 已经帮我们完成了大量工作。安装开发工具↓编辑源代码↓编译↓链接↓生成可执行程序↓运行↓修改↓重新构建↓软件包管理Vim↓代码编辑GCC / G++↓编译与链接↓自动化构建本文就从这条开发链开始。互联网随机搜索 Vim软件仓库下载。CC = gcc$(CC)$(TARGET)CC = gccapt / dnf↓安装开发工具↓Vim↓编辑 C/C++↓GCC / G++↓。

2026-10-02 16:35:05 573 21

原创 C++智能指针详解:从RAII到unique_ptr、shared_ptr、weak_ptr及其底层原理

/ 使用 pdelete[] p;new和delete能够一一对应,看起来就不会出现问题。异常多条 return 路径复杂函数调用多个动态资源事情就没有这么简单了。int a = 10;int b = 0;new array1↓new array2↓Divide()↓throw↓直接离开 Func根本没有执行。内存泄漏资源获取即初始化把 new 写进构造函数这么简单。把资源的生命周期绑定到一个对象的生命周期。

2026-09-24 15:37:53 319 2

原创 C++异常详解:从 throw、try/catch 到栈展开、RAII 与 noexcept

除数为 0文件打开失败内存申请失败数组访问越界数据库连接失败网络请求失败用户参数非法if (error)return -1;// 处理错误错误码Error CodeC 语言中大量接口都采用这种设计。main↓HttpServer↓↓SqlManager↓Database检查返回值↓判断错误↓继续返回错误码大量正常业务代码会被错误处理代码打断。异常Exceptionpublic:int id), _id(id){}return _id;

2026-09-04 23:59:22 620 9

原创 C++11详解(四):Lambda、std::function与std::bind——彻底理解可调用对象

这种形式调用的东西并不只有普通函数。普通函数函数指针仿函数Lambda成员函数bind 返回对象可调用对象Lambda 表达式std::bind中。它可以理解成:接收一个可调用对象,再绑定或重新安排一部分参数,最终返回一个新的可调用对象。占位符命名空间。新函数第一个参数→ Sub 第一个参数新函数第二个参数→ Sub 第二个参数。

2026-09-03 22:27:08 357 24

原创 C++11详解(三):可变参数模板、emplace与类的新特性

Print(1);参数类型不固定只有 1 个Print();Print(1);类型可以变化参数数量也可以变化可变参数模板参数类型可变参数数量可变Target((args)...可变参数模板转发引用引用折叠完美转发组合起来。emplace则是这套技术在 STL 中最典型的应用之一。=default=delete成员默认初始化overridefinal进一步加强了类的接口约束与可读性。

2026-09-03 01:06:00 298 22

原创 C++11详解(二):右值引用、移动语义、std::move与完美转发

由于strings1↓一块堆空间申请新空间↓复制字符串内容↓让 s2 管理新空间深拷贝vectorstringlistmap自定义资源管理类拷贝代价可能比较高。int a = 10;a * pss [ 0 ]表示一个具有身份、可以持续存在的对象& a & s取得地址。临时结果这些结果通常没有必要长期保留原来的资源。移动C++11 移动语义左值 / 右值↓ ↓T& T&&左值引用 右值引用std::move移动构造 / 移动赋值避免深拷贝。

2026-09-02 01:25:31 437 20

原创 C++11详解(一):统一初始化——列表初始化与 initializer_list

在 C++98 中,不同类型往往使用不同方式初始化。int x;int y;int x = 10;数组 → {}普通变量 → =对象 → ()容器 → 一个一个插入初始化语法并不统一。{}列表初始化class Datepublic:{}private:int _year;int _month;int _day;202511寻找能够匹配的构造函数。可以把它理解成:一个轻量级对象,用来访问编译器为创建的一组只读元素。il↓。

2026-09-02 00:38:14 424 14

C++ 类和对象入门(四):日期类 Date 的运算符重载实现详解

日期对象的实现

2026-06-09

这里给大家一个可以直接使用的ResNet的python代码参考

这里给大家一个可以直接使用的ResNet的python代码参考

2026-05-28

空空如也

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

TA关注的人

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