- 博客(31)
- 收藏
- 关注
原创 C++ 堆对象、构造函数传参、单例与智能指针:从 new 到 make_unique
在 C++ 中,newvector、智能指针和单例模式经常会同时出现。理解它们背后的构造函数调用规则,能帮你少踩很多坑。
2026-11-07 01:28:33
144
原创 Linux 网络编程:彻底搞懂 bind、connect 与 sockfd 的地址( IP 地址 + 端口号 组成的网络通信端点)分配机制
bind是显式告诉内核"我是谁",connect是告诉内核"我要连谁"。sockfd本身只是个整数,但内核通过它关联了完整的连接信息。服务端必须显式bind到固定端口,否则客户端找不到入口。客户端通常不显式bind,由内核在connect时自动分配本地端口。sockfd不直接存 IP 和端口,但内核通过它保存了完整的四元组,你只需要拿着它读写即可。
2026-10-20 16:26:42
81
原创 为什么绑定 0.0.0.0 就能监听所有 IP?从 struct sockaddr_in 到内核 socket bind的详细介绍
保存的是网络地址信息;bind把这些信息写入内核 socket 对象;sockfd就是这个内核对象的句柄;0.0.0.0不是真实 IP,而是内核约定的通配地址;绑定只要发到本机这个端口的连接,不管目标 IP 是哪一个,都交给这个 socket。
2026-10-20 00:58:27
282
原创 Linux网络编程accept的讲解
accept从监听队列里拿出一个已完成握手的连接,返回一个专属的文件描述符用来和这个客户端通信,同时让监听套接字继续接待下一个。
2026-10-19 22:45:03
206
原创 C++ 枚举指南:从 enum 到 enum class
编译器会自动给每个名字分配一个整数值,从 0 开始递增名字对应的整数值RED0GREEN1BLUE2OK = 0,MON = 1,TUE, // 2WED, // 3THU, // 4FRI // 5语法和传统枚举几乎一样,只是多了个class关键字。特性enumenum class作用域泄漏到外层有自己的作用域隐式转int可以(不安全)不可以(必须显式转换)指定底层类型不行可以命名冲突容易冲突不会冲突switch (d)
2026-09-10 21:45:00
50
原创 C++ 运算符重载指南
int _month;int _day;d += 5;// 编译器理解成:核心规则:左操作数必须是当前类的对象,this指针自动指向它。所以参数列表里只需要写右操作数。对比项成员函数非成员函数左操作数固定是当前类对象(this没有this,必须显式写参数个数只写右操作数左右都要写能否访问私有成员能(本身就是成员)需要friend声明// ❌ 两个都是内置类型,禁止重载// 编译报错// ✅ 至少一个是自定义类型。
2026-09-10 17:03:37
158
原创 C++ 多态的底层核心三个概念:虚函数表 (vtable)、虚表指针 (vptr) 和 间接寻址
多态的开关,永远掌握在“父类”手里!如果父类没加virtual,这扇门就是关死的。子类就算自己喊破喉咙(写了),也进不了虚表。只有父类加了virtual,这扇门才会打开,编译器才会在虚表里给析构函数留位置,子类的打包函数才有机会被放进去。只要你的类打算被继承,并且未来会通过基类指针去delete,那么它的析构函数就必须是虚函数!一句话总结子类的虚表都是拷贝父类的,父类有的虚函数,子类才有,才能重写后写入虚表空间换时间:用每个对象多占 8 字节(64位系统下vptr。
2026-08-24 02:17:12
296
原创 网络编程第一步:从 `socket()` 到 `sockaddr_in` 的底层逻辑全解析
在网络编程中,一切通信都始于套接字(Socket)。这行代码的本质,就是向操作系统申请建立一个网络通信的“端点”(Endpoint),并返回一个文件描述符(_sockfd后续所有的绑定(bind)、接收(recvfrom)、发送(sendto)等操作,都要靠这个编号来指代这条专属的通信管道。socket()AF_INETAF_INET6SOCK_DGRAM(注:如果这里写的是,则代表采用面向连接、可靠的 TCP 协议。
2026-08-24 01:10:19
370
原创 为什么服务器bind了特定 IP,客户端访问就必须使用这个 IP?
回到最初的问题:● 如果服务器绑定了具体 IP,客户端必须使用该 IP,因为操作系统内核只认这个“专属门牌号”。● 如果服务器绑定了0.0.0.0,客户端可以使用服务器任意可达的 IP,因为服务器开启了“全量接收”模式。
2026-08-23 00:00:40
202
原创 sockaddr_in 和sockaddr的用法区别
sockaddr作用通用地址结构IPv4地址结构里面有什么原始字节IP+端口程序员常用吗很少直接用经常用bind需要什么sockaddr*需要转换支持所有协议只支持IPv4创建:socket()准备地址:绑定:这个固定套路。学习accept()&len);具体结构体负责存信息,通用sockaddr负责接口统一。
2026-08-21 20:00:00
212
原创 关于变量声明和定义的解释(static)
只有当你在main这一刻,编译器才会按照图纸,在内存(栈区或堆区)中真正为obj分配内存,其中就包含了a的空间。所以,成员变量a的真正“定义”(内存分配),是随着对象的创建而发生的。类里的int a;= 声明(画图纸,不占内存)。创建对象= 定义(按图纸盖房子,分配内存)。类里的= 声明(图纸上标记个特殊房间)。类外的= 定义(真正盖这个特殊房间)。
2026-08-19 16:44:37
178
原创 深入理解并发编程:临界区、临界资源与线程的“三角关系”
临界资源、临界区和线程构成了并发编程的底层逻辑。线程是并发的执行体,临界资源是它们争夺的焦点,而临界区则是我们通过加锁等手段划定的安全保护区。只有理清这三者的关系,严格遵守互斥与同步的准则,我们才能编写出既高效又安全的并发程序。
2026-08-18 17:41:44
336
原创 C++ 成员指针深度解析:为什么它不能像普通指针那样直接解引用?
为了方便记忆,我们可以通过以下对比来梳理:特性普通指针 (int*void(*)()成员指针 (int A::*存储内容绝对内存地址相对偏移量(可能包含 this 调整量)是否依赖对象否(静态成员除外)是(必须绑定具体对象实例)解引用/调用直接*p或p()必须用obj.*p或只要带了这个星号,不管是函数还是变量,都是“残缺”的指针。它们只描述了“在哪里”,而没有描述“属于谁”。必须配合.*或->*绑定对象后,才能完成真正的访问。
2026-08-16 19:45:02
348
原创 C++函数指针语法和类型
函数指针是 C/C++ 中一种的机制,它允许程序在运行时动态选择并调用不同的函数,是实现回调、策略模式和插件系统的核心基础。
2026-08-16 19:17:52
331
原创 软链接和硬链接对比讲解
在 Linux/Unix 文件系统中,和是两个非常核心的概念。。在 Linux 中,文件名只是指向 Inode 的一个“别名”,而 Inode 才是真正存储文件数据位置、权限、大小等元数据的地方。2. 软链接 (Soft Link / Symbolic Link)本质: 软链接是一个独立的文件,它的内容是源文件的路径字符串。创建命令: ln -s 源文件 软链接名1.独立 Inode: 软链接有自己的 Inode,与源文件不同。
2026-08-12 01:04:14
228
原创 深入理解 Linux 管道通信:从匿名管道到命名管道的底层原理与工程避坑
无论是匿名管道还是命名管道,本质上都是操作系统在内核中开辟的内存缓冲区。匿名管道是“家族内部群聊”,靠血缘和继承连接;命名管道是“公共聊天室”,靠共同知道的文件名连接。
2026-08-11 17:50:11
432
原创 内存和缓冲区的关系
CPU 把数据一股脑全塞进内存里的“缓冲区”,然后告诉硬盘:“你自己慢慢从缓冲区里搬走吧,我要去干别的活了!:让慢速的硬盘慢慢把数据先搬到内存里的“缓冲区”,然后 CPU 直接从缓冲区里“唰唰唰”地拿数据。如果没有缓冲区,CPU 每次读写硬盘,都要停下来傻等硬盘转圈圈,这就太浪费 CPU 的生命了。(也就是你的程序自己的内存)中的一个缓冲区里(通常是 8KB 大小)。:是真实的物理硬件(RAM),是你程序运行时的底层资源。:数据并不是直接从父进程的内存“飞”到子进程的内存里的。
2026-08-11 02:36:05
385
原创 认识读写锁(pthread_rwlock)
读写锁:作用:它和 mutex 最大区别:mutex:读写锁:二、读写锁类型定义:例如:这个变量就是一把读写锁。但是:刚定义出来不能直接使用。必须初始化。参数1:rwlock类型:意思:例如:定义:初始化:这里:就是把锁的地址传进去。类型:意思:一般我们不用特殊属性。所以:传:表示:使用默认属性。成功:失败:注意:pthread系列函数和普通Linux函数不一样。例如:失败:返回:但是:pthread
2026-08-08 11:41:17
213
原创 ELF文件结构详细作用对比,以及程序入口函数讲解
在 ELF(Executable and Linkable Format)文件结构中,各个组成部分就像是一栋大楼的蓝图与建筑材料。以下是 ELF 文件核心结构的详细作用与对比总结表:结构名称主要作用核(ELF 头)。定义整个文件的基本属性和文件头的整体布局信息。操作系统加载器、链接器(ld(程序头表)。告诉操作系统在运行时如何将文件的不同部分映射到进程的虚拟地址空间。LOAD(运行时使用).textSection)。包含 CPU 可以直接读取并执行的二进制代码(如函数体、循环逻辑等)。CPU 核心。
2026-08-05 18:30:22
357
原创 Linux 静态库与动态库制作与调用的完整对比与步骤总结
注意这里运行./app_dynamic 文件可能会报错,原因是gcc知道当前目录下面有。存在,否则会报 cannot open shared object file。但是linux动态加载器不知道去哪里找,所以要告诉linux动态库在哪。才加载到进程的虚拟地址空间,多个进程可共享一份物理内存。,删掉静态库文件程序依然可以独立运行。时会将代码直接打包复制进可执行文件。:这是一个临时方法,运行时必须保证。:运行不再需要 libadd.a。链接并生成可执行文件。
2026-08-03 15:27:20
176
原创 Linux 底层明明是 open/read/write,为什么日常写C语言代码只见到 fopen/fread/fwrite?
额外扩展一下 open函数,这是操作系统原生的接口。但我们初学 C 语言写代码时,从头到尾见到的全是带 f 的函数,从来没见过原生的 open、read、write。这并不是知识点冲突,而是,本文彻底讲透二者的关系、区别、使用场景,补齐绝大多数初学者的知识盲区。
2026-08-03 15:04:25
374
原创 Linux 文件IO深度剖析:内核fd、C语言FILE*、C++文件对象三层终极区别
Linux 内核没有文件对象,只有 fd 文件描述符,所有文件IO本质都是操作 fdC 语言没有对象,FILE* 只是库提供的结构体包装C++ 才有真正的文件对象(流对象),属于语言库封装,不改变内核机制文件名只用于 open 阶段,读写阶段一律只用 fd高层库(C stdio / C++ fstream)全部是对底层 read/write 的封装。
2026-08-01 18:51:06
175
原创 关于Linux 下 main、argc、argv 与系统命令底层原理总结
Linux 所有外部命令工具(ls/cat/gcc)都是独立 ELF 可执行二进制文件;可执行程序统一以作为程序入口;argc 保存参数总数量,argv 数组存放切割后的命令字符串,由 shell 准备并传递给 main;在终端执行外部命令:shell fork 子进程 + exec 加载目标程序,最终运行程序内部 main;手写 C 语言程序 和 Linux 系统自带命令底层运行模型完全相同;执行命令不等于函数调用,会创建全新进程,和进程内普通函数调用有本质区别。
2026-08-01 15:55:46
196
原创 关于write和read函数里面的传参类型说明(sizeof和strlen的区分)
为什么传变量 / 结构体要强制转换 (char*)函数只接收 char*,任意其他类型(int*, 结构体指针)都必须强转成 char*,把数据当成原始字节流处理。接下来详细讲解怎么区分第二个参数的总字节量,关于sizeo和strlen的使用区分。
2026-07-31 16:56:01
206
原创 C++ fstream文件流实战七大踩坑总结
在练习文件读写、文件指针移动、流式读取时,会遇到各种莫名其妙的BUG:文件创建失败、读取内容异常、指针移动失效、重复输出字符等。sizeof(str) 计算的是整个数组字节数,包含末尾不可见的\0,会一并写入文件,导致文件多一个空字符、文件体积偏大。ios::in 的语义是“读取已有文件”,只要携带in模式,系统默认文件必须提前存在,直接禁用自动创建功能。3. ios::out | ios::in:不创建、不清空、仅打开已有文件。:ios::out | ios::in 模式,文件不存在不会自动创建。
2026-07-31 12:19:35
300
原创 C++ 缓冲区详解:行缓冲、全缓冲、无缓冲(解决读写文件、cout 刷新,c语言原理也类似)
文件读取时遇到的 \n,只作用于输入流,仅仅是 getline、>> 的读取分隔标记,用来判断何时结束当前读取。换行符残留在输入缓冲区中,后续 getline 执行时,一读就碰到残留的 \n,直接判定读取结束,得到空内容。这就是为什么同样的代码,控制台运行正常,输出到文件时数据迟迟不落地的核心原因。总结:输入流的换行只管读数据,输出流的换行只管刷数据,两者完全独立互不干扰。读取数据时,会读取有效字符,但不会读取、不会清空末尾的 \n 换行符。规则:无任何缓存机制,写入数据的瞬间直接落地,不等待、不暂存。
2026-07-30 23:29:14
316
原创 关于linux里面的exec系列
这execvp函数和上面execlp函数结果是一样的,相等于执行execlp("ls", "ls", "-l", NULL);都是以argv【】的形式传参,对于argv【0】是进程名,可以随便起,但是默认和要执行的进程名(程序名)一致。"ls":传给 ls 程序的 argv [0]。其实p就是地址,带p系统自动去 PATH 路径寻找 ls,不用写/bin/ls。// 带p的,可以使⽤环境变量PATH,⽆需写全路径。// 带p的,可以使⽤环境变量PATH,⽆需写全路径。// 带e的,需要⾃⼰组装环境变量。
2026-07-30 20:03:29
367
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅