自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【Linux网络】吃透传输层王者 TCP(1):从报文结构到三次握手、四次挥手全原理详解

TCP 为什么需要用最少的代价,确认双方都具备通信能力,并且双方都愿意建立连接。TCP 是一种全双工协议,数据传输是双向的。因此,在建立连接之前,不仅要保证:A 能给 B 发数据;B 能给 A 发数据;还要确认:双方都具备发送和接收能力;双方都同意建立连接;中间网络没有阻碍通信。可以把建立连接理解成两个人建立联系:两个人想成为夫妻,不仅要双方都愿意,还要确保中间没有任何阻碍。双方都愿意通信;网络链路正常,没有中间环节阻碍通信。TCP 采用三次握手,是因为 TCP 是全双工协议。

2026-11-06 09:12:53 353

原创 【Linux网络】网络基础概念(1):一文搞懂计算机网络:协议为什么存在?数据如何传输?

双方的网络协议栈必定是C语言的,传输层也是;如果双方的协议栈源码时一样的,左右两侧有两个一样的结构体,如果左侧定义结构体变量的值,那么右边马上就能解析出值Linux下一切皆文件,把网络也看作文件协议就是通信双方都认识的结构体数据类型我们以后看到的内核级协议,百分之百都是结构体类型同层之间的协议是认识的承上启下的故事:你买了一个快递,当快递小哥把东西给你,绝对不是直接给你,因为小哥没有权利知道你买的什么,所以是会装在盒子里,盒子上有快递单(快递单用C语言描述,就是一个结构体)。

2026-11-06 09:12:13 340 1

原创 【C++】智能指针的使用及其原理

什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存,一般是忘记释放或者发生异常导致释放程序未能执行造成的。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。内存泄漏的危害:普通程序运行一会就结束了,出现内存泄漏问题也不大——进程正常结束后,页表的映射关系会解除,物理内存也能正常释放。

2026-11-06 09:11:24 334

原创 【Linux】线程同步和互斥(5):线程池的实现&&线程安全

main.cc创建线程对象不代表线程被调用线程默认执行函数 DefaultRun ()--->作用:每个子线程启动后,都会循环打印自己的线程名 + 日志我们增加一个bool _isrunning,表示线程是否运行我们在线程stop中增加判断线程是否正在运行,只有在运行的线程才能stop线程池是一个典型的生产者消费者模型,同时我们也要支持用户是单生产者或者多生产者的情况。那么任务队列就是生产与消费的临界资源,我们就会选择互斥与同步---->互斥锁保护临界资源。

2026-07-22 19:02:25 515 1

原创 【Linux网络】传输层协议UDP

我们在学习协议的时候,是从应用层自顶向下学习的;今天学习传输层的UDP协议在计算机网络传输层中,最核心的两大协议就是 TCP 和 UDP。相比于复杂严谨的 TCP,UDP 更加轻量、简单。很多应用层协议如 DNS、直播、音视频通话、游戏联机等,底层都默认使用 UDP 协议。今天我们结合网络原理底层知识,完整梳理 UDP 协议的所有核心知识点。

2026-05-27 23:15:03 863 3

原创 【Linux网络】加餐:彻底搞懂 Cookie 与 Session:HTTP 无状态协议如何 “记住你”

你一定经历过:关掉浏览器再开 B 站,依然是登录状态;刷视频时,网站自动知道你是不是 VIP;购物车关掉再打开还在……这些神奇的 “记住我” 功能,背后全是 HTTP 会话保持 在支撑。但是我们之前学习HTTP的时候,学到过:HTTP协议是客户端与服务器之间通信的基础。客户端通过HTTP协议向服务器发送请求,服务器收到请求后处理并返回响应。HTTP协议是一个无连接、无状态的协议,即每次请求都需要建立新的连接,且服务器不会保存客户端的状态信息。

2026-05-26 22:42:29 587 3

原创 【Linux】线程同步和互斥(4)线程池及手把手实现日志

提前创建的一批专门用来处理任务的线程,目的是提高效率。用户有任何任务,交给线程池,线程池会自动的帮你处理--->线程池本质就是多生产者多消费者模型可以给每个线程都给一个任务队列,负载均衡的把任务交给任务队列所以之前写的基于管道的进程池也是生产者消费者模型。

2026-05-24 21:17:43 469

原创 【Linux】线程同步与互斥(3):POSIX信号量深度解析:手把手实现环形队列生产者消费者模型

在Linux多线程并发编程中,是继互斥锁、条件变量之后,又一个核心同步工具。相比于条件变量,信号量自带资源计数器,无需手动循环判断条件,代码更简洁、同步逻辑更直观,是实现的最优方案之一。本文将从零讲解POSIX信号量原理、PV操作核心逻辑,结合通俗故事拆解环形队列同步规则,最终手写一套的工程级环形队列代码,彻底吃透信号量并发模型。

2026-05-21 23:15:02 537 5

原创 【Linux】线程同步和互斥(2): 自习室+苹果故事详解生产者消费者模型

临界资源:同一时间仅允许一个线程访问的共享资源(VIP自习室、苹果盘子、队列缓冲区);临界区:线程访问临界资源的代码片段(在自习室学习的整个过程);线程同步:约束多线程访问临界资源的顺序,让线程并发更合理、高效、可预测,杜绝不公平竞争与饥饿问题。补充知识点:线程在临界区可以被CPU切换吗?可以!就像你在自习室学习时,可以暂时锁门去卫生间。虽然线程被切换,但临界资源依然被锁定,其他线程无法进入,临界区代码具备原子执行的效果。生产者:由一个或多个线程承担消费者:线程承担商品:数据。

2026-05-20 20:04:54 831 8

原创 【Linux】线程同步和互斥(1):线程互斥与加锁实现

当线程A执行到lock的第三条语句,时间片到了,被切走,此时A要保存它的硬件上下文-->eax=1,pc=3(表示执行到第三行代码);线程A回来,写入自己eax的值,从第三条语句继续执行,eax>0,线程A解锁成功。即使是多处理器平台,访问内存的总线周期也有先后,一个处理器上的交换指令执行时,另一个处理器的交换指令只能等待总线周期。当只剩一张票的时候,假设有A B C D 四个线程,当A把1加载到eax中时,A被切走。当A再次被调度过来,对tickets做--,同样的,B C D也会做--操作。

2026-05-17 15:41:13 567 1

原创 【Linux】线程概念与控制(3):线程ID&&C++封装线程

库函数:pthread_setname_np: 调用该函数的线程,可以根据指定线程名给线程设定名称;创建线程,就会在库里面创建描述线程的结构体 struct pthread(叫做用户级线程),同时在内核中创建PCB,属于LWP,这两个合起来叫做Linux下的线程解决方案。让一个线程进行start:首先一个线程是不能重复启动的,只有线程处于new或stop,才能启动;在内核和用户之间,增加一层pthread库,在这个库的内部,有没有新建的,运行的线程?在代码中我们要设计线程的状态:运行,新建,不运行……

2026-05-16 18:07:16 479

原创 【Linux】信号处理(3)信号处理&&valatile关键字

1 进程切换的本质:进程切换时,只是切换了进程的地址空间上下文,内核代码(系统调用实现)会被映射到每个进程的地址空间的高地址部分,因此无论切到哪个进程,都能执行同一套内核系统调用。2 关于特权级别,涉及到段,段描述符,段选择子,DPL,CPL,RPL 等概念,这块我们不做深究了,现在芯片为了保证兼容性,已经非常复杂了,进而导致 OS 也必须得照顾它的复杂性。主板上的时钟源晶振是一个硬件外设,它会以固定的时间周期(本质就是时间,通常 1ms,即1/1000HZ),向 CPU 发送硬件中断。

2026-05-15 18:17:30 583

原创 【Linux】线程概念与控制(2)线程控制与核心概念

体现在代码的层面上,可以新线程自己分离,也可以主线程分离新线程,主线程就不再关心新线程。因为它的类型是明确的,是指针,32位平台下是4字节,64位平台下是8字节)在pthread库里面,会单独有一个空间,是单独存在的,它会把当前线程结束时所对应的退出数据或void*类型变量。直接写道这个空间里面,我们把线程创建出来,默认改线程是必须被join的,如果不join,就会造成类似僵尸进程的问题;之后主线程想通过函数获取这个保存在库变量里面的值 ,这个值是void*类型的,把void*类型变量拿出来,就得定义。

2026-04-25 23:14:50 484 1

原创 【Linux】线程概念与控制(1)线程基础与分页式存储管理

进程=内核数据结构+自己的代码和数据在内核视角:进程是承担分配系统资源的基本单位线程是进程内部的一个执行分支;线程的粒度比进程细,小,更轻一点。

2026-04-23 23:07:59 468 1

原创 【Linux】进程信号(2)保存信号与信号处理

如图中void sighandler(int signo),用户通过signal()或sigaction()系统调用注册的自定义信号处理函数我们以前学过的signal(3,handler)方法(设定对特定信号的自定义捕捉动作),signal的这个方法作用是找到handler表,在3号下标处,把用户对应的地址设定起来,这样信号就能保存。

2026-04-19 23:09:28 537 2

原创 【Linux】进程信号(1)理解信号及信号产生的方式

signal 系统调用:收到某个信号时,用哪种方式处理参数含义:signum:要处理的信号编号(如 SIGINT、SIGQUIT)handler:信号的处理方式,有 3 种选择:SIG_DFL:使用系统默认动作(通常终止进程)SIG_IGN:忽略该信号自定义函数名:收到信号时自动调用这个函数(调用signal时,可以把自己写的函数【返回值void,参数int】,把函数的入口地址设置进来)向这种给一个函数,把另一个函数以参数的形式设置进来,叫做回调。

2026-04-18 23:19:04 548

原创 【Linux】进程间通信(3)system V信号量

理解:电影院有很多座位,是被所有人共享的,但是很少有人因为座位争执,是因为保证了资源可控,每个人都有份;当我们想看电影的时候,要先申请资源,也就是座位,那这个座位真正属于的时候是什么时候?但实际上,由上面的C语言结论得知,我们知道每个元素实际上是共享内存,消息队列,信号量的结构体--->也就是子类结构体。返回的时候,xxxid也是一个数组下标、假设已知的指针数组的下标为p,那么强转成对应的结构体类型 (struct serm_array*)p-> 就能访问该结构体的内容。你怎么知道指向的内容是什么?

2026-04-10 23:02:13 711 5

原创 【Linux】进程间通信(2)命名管道&&共享内存

核心区别:读打开非阻塞时直接成功,写打开非阻塞时直接失败;阻塞模式下,读写打开都会等待对应端进程打开。但是我们使用管道的通信方式效率低,应用场景少,就需要有新的进程间通信我们要规定标准:System V (只能做一台主机上的进程间通信)我们基于System V这个标准,产生了三种进程间通信:共享内存,消息队列,信号量我们下面来学习共享内存。

2026-04-09 22:36:48 403 1

原创 【Linux】进程间通信(1)管道&&进程池实现

进程间通信指的就是两个或多个进程,进行互相传递信息的过程进程具有独立性-->进程=内核数据结构+代码和数据,要规避进程之间的耦合关系所以,至少在目前,一个进程把自己的数据,发送给另一个进程也是一件比较困难的事但是父进程的全局变量不是能交给子进程吗?但是这不是通信,是父给子的,且只能给全局变量,所以只能叫做继承数据,无法做到持续性通信管道是Unix中最古老的进程间通信的形式。我们把从一个进程连接到另一个进程的一个数据流称为一个“管道”结论1:父子进程为什么会向同一个显示器打印?因为指向了同一个文件。

2026-04-05 23:26:57 515 2

原创 【Linux】库的制作和使用(3)ELF&&动态链接

对比维度静态链接(Static Linking)动态链接(Dynamic Linking)链接时机编译 / 链接阶段一次性完成程序运行时(加载阶段 / 运行阶段)完成库代码处理将库的目标代码直接复制、合并到可执行文件中不复制库代码,仅记录依赖关系,运行时再加载文件形式库文件为静态库(.a.lib库文件为动态库(.so.dll可执行文件大小较大(包含所有用到的库代码)较小(仅含程序自身代码和依赖信息)运行依赖无外部依赖,可独立运行依赖目标系统中存在对应版本的动态库内存占用。

2026-04-04 23:14:07 790 1

原创 【Linux】库的制作与使用(2)ELF&&静态链接

Section 合并程序编译、链接阶段,编译器会将代码段(.text)、数据段(.data)、BSS 段等不同section(段)进行合并,形成连续的指令和数据块,这是地址分配的基础。统一编址合并后的可执行程序会进行统一编址,包含两种方式:绝对编址:直接给指令 / 数据分配固定的虚拟地址(如起始地址设为 0x00000000);相对编址:以某个基准点(如函数起始地址)为参考,用偏移量表示地址,笔记中 “以一开始作为参照点” 就是这个意思。

2026-04-02 23:22:38 958 1

原创 【Linux】库的制作与使用(1):库的概念及动静态库

我们学习这部分内容,主要分三个部分:1. 如和制作库---站在库的制作者角度2.如何使用库---库的使用者角度3.库的制作原理和加载原理---ELF库是写好的现有的、成熟的、可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:静态库动态库库类型Linux 后缀Windows 后缀动态库.so.dll静态库.a.lib为什么要有库?

2026-04-01 23:17:20 667

原创 【Linux】EXT文件系统(2)

我们已经能够根据 inode 号在指定分区内定位文件,也能根据目录文件的内容,找到目标 inode。在单个分区内,我们几乎可以对文件系统进行任意操作。但随之而来的问题是:inode 无法跨分区使用,而 Linux 系统又可以挂载多个分区,那我该如何确定当前操作的文件 / 路径究竟位于哪一个分区呢?我们要解决这个问题,要了解一些运维:一个磁盘被用户使用,要经过哪些步骤?(1)分区(2)格式化:本质是想分区写入文件系统,也就是管理信息。

2026-03-29 22:45:02 468 4

原创 【Linux】Ext文件系统(1)

Super Block是描述整个文件系统的管理信息GDT是组描述符表Block Bitmap是一个位图结构,包含:比特位的位置--->可以和块号进行映射,比特位的内容----->表明对应的块是否被占用,1表示被占用,0表示没有被占用(用量衡量一个组里面块的使用情况)inode Bitmap:也叫做inode位图,:用1 个 bit 对应 1 个 inode,通过 bit 的位置与 inode 表(inode table)中的具体 inode 一一映射。

2026-03-28 22:13:39 796 2

原创 【Linux】文件:基础IO

fd是文件描述符,文件描述符是操作系统(尤其是 Unix/Linux 系统)为了管理打开的文件 / IO 资源,给每个打开的文件分配的一个非负整数标识符。你可以把它理解成:操作系统给每个 “正在使用” 的文件(广义的文件,包括普通文件、管道、网络套接字、设备文件等)分配的一个 “编号”,程序通过这个编号就能找到对应的文件,而不用直接操作复杂的文件底层结构重定向:改变文件描述符对应的“实际文件/设备”,使原本输出到A设备的内容,输出到B文件/设备(常见:> 输出重定向、>> 追加重定向、< 输入重定向。

2026-03-25 22:05:48 582 1

原创 【Linux】进程控制(2):进程等待&&进程替换

非阻塞等待:我不傻等,我该干嘛干嘛,抽空看看你完事没;阻塞等待:我啥也不干了,就盯着你,等你完事我再动。waitpid的返回值:成功:返回值>0,返回的是子进程的pid失败:返回值<0 ,返回-1状态没有改变:返回0非阻塞轮循最明显的特点:父进程不会卡在那最佳实践--->目前阻塞等待是最佳实践int main()pid_t pid;// 创建子进程,父进程返回子进程PID,子进程返回0if(pid < 0){ // fork失败return 1;

2026-03-22 23:22:48 604 5

原创 【Linux】进程控制(1):进程创建&&进程终止

目录一 进程创建1 知识点回顾(1)fork函数初识(2)fork函数的返回值(3)写时拷贝(4)fork的常用用法(5)fork调用失败的原因2 写时拷贝(1) 写时拷贝的原理--->部分(2)为什么要有写时拷贝3 关于进程创建的实际应用场景二 进程终止1 进程终止的几种情况(1)怎么知道代码跑完了,结果正不正确?(2)代码没跑完,异常了,怎么去衡量异常?(3)结论2 进程常见的退出方法(1)echo $? 命令(2)退出码(3)_exit函数(4)exit函数(5)exit和return有什么区别(6)

2026-03-21 23:25:18 681 10

原创 【Linux】进程(6):程序地址空间

我们通过一个故事来理解:有一个大富翁,他有很多很多的钱,大概有十个亿。他给他的每一个私生子都画饼说:我的这笔钱以后都由你继承(私生子互相不知道对方的存在),那么这个时候就会让私生子产生一种错觉:我独占资源---为什么后面介绍在这个里面:大富翁就是操作系统,十个亿就是内存,私生子就是进程,画的饼就是虚拟地址空间画饼的原因:操作系统想要进程有独占系统空间的错觉(原因见标题六)那么画的饼本身需不需要被管理?给每个人画画的饼都不同,需要!如何管理?

2026-03-19 19:26:55 597 8

原创 【Linux】进程(5):命令行参数和环境变量

目录一 命令行参数和环境变量1 命令行参数2 环境变量(1)概念+实际场景(2)引入Linux环境变量(3)获取,设置环境变量(4)理解环境变量,修改配置文件实验环境变量具有全局属性——本质:环境变量被子进程继承了!和环境变量相关的命令main函数有参数吗?有的 其中:char* argv是指针数组,有效元素是argc个我们通过下面这个程序,来演示一下命令行参数:同一个程序,根据选项的不同,呈现出不同的功能, 这种功能是通过命令行参数完成的通过上面的两个参数我们发现:bash是以空格为分隔符,把每个

2026-02-08 21:59:00 804 10

原创 【Linux】进程(4):进程优先级&&调度队列

因为操作系统不建议修改优先级,可能对程序的平衡性产生影响,所以我们在修改nice值的时候可能会受到系统阻拦,但是超级用户可以修改,所以我们用whoami查看是否为超级用户,可以使用sudo提权。因为在Linux中,真正标识“我”这个人,是通过UID这个数字,但是人看数字不舒服,所以Linux系统会在相关配置文件把用户名和UID的关系建立起起来,打印时默认打印用户名。寄存器是一个硬件,寄存器内部的数据是=称为当前进程的硬件上下文:CPU内部进程相关的所有寄存器的内容(内部的数据)

2026-02-07 21:26:31 832 6

原创 【Linux】进程(3):进程状态

这就保护了正在执行关键I/O的进程,防止被OS误删,避免了类似银行账单丢失的事故。s状态属于操作系统中的阻塞状态(例如前面讲到的最典型的阻塞状态:代码中里有一行scanf输入代码, 不输入时就会卡住),s状态时,可以用crtl+c或者kill-9杀掉,所以把s状态叫做。进程的退出状态必须被维持下去,因为它要告诉关心它的进程(父进程),你交给我的任务,我办的怎么样了。键盘属于硬件,操作系统管理硬件也要先描述,再组织,硬件再底层也有对应描述的结构体(包含硬件的相关属性,进程PCB的队列)

2026-02-05 22:38:22 935 9

原创 【Linux】进程(2):进程概念与操作理解

进程 = 内核数据结构(task_struct) + 自己的程序代码和数据内核数据结构(struct task_struct):这是进程的 “学籍信息”,包含了进程的 PID、优先级、内存地址、状态等元数据,是操作系统管理进程的核心。程序的代码和数据:这是进程的 “本人”,即被加载到内存中的可执行程序内容。传统教材常说:“运行起来的程序就是进程” 或 “加载到内存的程序叫做进程”。但是这种说法只强调了 “代码和数据加载到内存”,忽略了内核为管理进程而维护的数据结构,显得过于片面,不易理解。

2026-01-31 23:19:36 1046 12

原创 【Linux】进程(1):冯诺依曼体系结构+操作系统

如果问题问的是计算机的基本结构,则通常指的是冯・诺依曼体系结构。后面我们用 “银行小窗口” 的故事:用户(程序)不能直接进入银行后台(内核),只能通过柜台窗口(系统调用)办理存款、取款(访问内核资源)等业务,这既保证了安全,也规范了交互流程。为了完成最终的打印,它会封装并触发对应的系统调用,由操作系统内核负责与硬件交互,完成实际的输出操作。计算机的模块化,是指将整个计算机系统拆解为功能独立、接口标准的硬件或软件模块,这些模块可以像积木一样单独设计、制造、升级和替换,最终组合成完整的系统。

2026-01-30 23:12:05 1021 3

原创 【Linux】基础开发工具(6):版本控制器git&&调试器gdb/cgdb

到最后,老师也说李四你现在写的还没之前写得好,算了,你把第三版交上来吧,我就算你过,这个时候张三就能交出来第三版的实验报告。如果我们在做项目的时候,每一次都把之前的记录下来,可是实际的项目都很大啊,每一次的都保留下来,那修改了成千上万次有那么多的空间保存吗?:在本地就可以完成版本管理(例如版本的提交,日志的提交,版本的回退),只不过做完需要同步到远端,在网络层面上是中心化的,但是在版本控制上各自管理自己的。对于图片,视频等二进制文件,虽然也能控制,但无法跟踪文件的变化,只能看到内存大小的变化。

2026-01-26 23:23:42 944 4

原创 【Linux】基础开发工具(5):Linux的第一个程序:进度条

printf 确实支持彩色输出,核心是通过 ANSI 转义序列(控制字符组合)告诉终端切换文字颜色、背景色,甚至设置高亮、下划线等样式 —— 这能让我们的进度条更醒目(比如进度条用绿色、百分比用黄色、提示信息用蓝色)但是我们其实可以发现这个程序还是有很多的问题的,比如process的进度不一定和下载进度相匹配,进度计算没有边界校验等等问题,所以这个思路其实不够完善,我们引入第二个思路。但是现在这个程序有两个问题:(1)休眠间隔时间太长,(2)进度条应该是在一行中输出(下一行覆盖前一行),而不能在多行输出。

2026-01-22 17:46:36 929 3

原创 【Linux】基础开发工具(4):自动化构建--make/makefile

・一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile 定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。编译器将多个 C 源文件(如add.c、sub.c)转换为目标文件(.o文件,如add.o、sub.o),之后链接器将目标文件与库文件结合,生成可执行程序。makefile 带来的好处就是 ——“自动化编译”,一旦写好,只需要一个 make 命令,整个工程完全自动编译,极大的提高了软件开发的效率。

2026-01-15 15:30:59 1237 3

原创 【C++】异常:概念及使用

但是一个声明了noexcept的函数抛出了异常,程序会调用 terminate 终止程序。程序的执行从throw位置跳到与之匹配的catch 模块,catch可能是同⼀函数中的⼀个局部的catch,也可能是调用链中另⼀个函数中的catch,控 制权从throw位置转移到了catch位置。• 如果到main函数,异常仍旧没有被匹配就会终止程序,不是发⽣严重错误的情况下,我们是不期望 程序终止的,所以⼀般main函数中最后都会使永catch(...),它可以捕获任意类型的异常,但是是 不知道异常错误是什么。

2025-11-30 16:36:53 988 13

原创 【Linux】基础开发工具(3):编译器

假如说你是张三,你考上了当地的一中,但是这个一中管理非常的严格,不能带手机,于是你问学长学校附近哪里有上网的地方,学长给你说学校的东门出去向左100米,向右100米,有一家电竞馆,于是你决定在学校里完成任务之后,出去上网,但是随着去电竞馆的人越来越多,电竞馆就被举报了,110就来关闭了电竞馆。静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大(大不少,前面展示过了),但在运行时也就不再需要库文件了。当有很多的源文件时,先把源文件编译成.o文件,然后再把.o链接。

2025-11-29 22:02:29 1283 6

原创 【C++】C++11(3):类&&lambda

如果你没有自己实现移动赋值重载函数,且没有实现析构函数、拷贝构造、拷贝赋值重载中的任意⼀个,那么编译器会自动生成⼀个默认移动赋值。默认生成的移动赋值函数,对于内置类型成员会执行逐成员按字节拷贝,定义类型成员,则需要看这个成员是否实现移动赋值,如果实现了就调用移动赋值,没有实现就调用拷用赋值。(默认移动赋值跟上⾯移动构造完全类似)

2025-11-28 21:46:38 1032 5

原创 【C++】C++11(2):右值引用补充&&可变参数模板

但是结合我们在5.2章节的讲解,变量表达式都是左值属性,也就意味着一个右值被右值引用绑定后,右值引用变量表达式的属性是左值,也就是说Function函数中t的属性是左值,那么我们把t传递给下一层函数Fun,那么匹配的都是左值引用版本的Fun函数。右值引用的右值引用折叠成右值引用(`T&& && → T&&`),所有其他组合均折叠成左值引用(`T& & → T&`、`T& && → T&`、`T&& & → T&`)。`,这样写会直接报错。但通过模板或 typedef 中的类型操作,可以构成引用的引用。

2025-11-27 21:02:28 933 4

空空如也

空空如也

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

TA关注的人

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