自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 socket编程基础+UDP套接字

不能bind公网---->公网IP其实没有配置到你的IP上,公网IP无法被直接bind,如果我们显示的进行bind,client来访问的时候就必须使用server端bind地址信息 不建议bind特定的IP。本地环回:要求c,s必须在一台机器上,表面我们是本地通信,client发送的数据不会被推送到网络,而是在os内部,转一圈直接交给对应的机器。2>从技术角度,pid也可以,但pid系统的一个概念,pid变,网络也跟着变,则干脆分开,解耦。socket会有很多的种类,来,满足不同的应用场景。

2026-11-03 15:07:11 78

原创 网络基础篇

网络:通过网络通信也是设备--->设备,其中唯一的一个区别,单纯的距离变长了导致了异地,然后就出现了新的问题。再识协议:本地--->所有设备是通过线连接---->所有在计算机内部本身就是一个网络结构。自顶向下分装------>必须贯彻os,贯穿协议栈。--->先局部再整体慢慢产生。初始协议:减少通信的成本,用于快速形成共识----->本质是一种约定。system call和操作系统----->传输层 网络层。以太网---->本质:共享的资源(临界资源,互斥)驱动程序----->网卡驱动 数据链路层。

2026-09-24 16:41:23 122

原创 线程复习大纲

其中:struct page mem[1048576]将虚拟和物理地址转换成对数组的操作->所以每个page都会有下标-->每一个page的起始物理地址,天然就知道-->具体物理地址=起始物理地址+页内(4KB)偏移。若是创建一个进程,共享窗口呢----->将资源再分配(划分地址空间即划分虚拟地址范围)给不同的task_struct,就用进程模拟出。细节3:进程,一张页目录+n张页表构建的映射体系,虚拟地址是索引,物理地址是目标,虚拟地址(低12)+页框地址=物理地址。结论4:我该如何面对历史的进程呢?

2026-09-10 17:47:08 106 2

原创 匿名管道+进程池

4,写继续,读关闭-------写端再写入,没有任何意义(os不会做没有任何意义的事情,os会杀掉写端进程,发生异常信号)3,写关,继续读----read读到返回值为0,表示读到文件结尾。1,写慢,读快---------读端就要阻塞(进程)即等写。2,写快,读慢-----满了的时候,写就要阻塞等待。4,管道是单向通信的(属于半双工的一种特殊情况)注:任何一个时刻一个发一个收----半双工。任何一个时刻同时发收-----全双工。5,(管道)文件的周期,是随进程的。基于匿名管道-----进程池。

2026-07-05 18:08:24 206

原创 自定义shell

编写Makefile。

2026-05-13 08:04:19 45

原创 从环境变量到进程地址空间:Linux系统学习笔记

写时拷贝(Copy-On-Write):当子进程被创建时,不会立即复制父进程的整个地址空间,而是和父进程共享同一份物理内存,只有当进程需要修改数据时,才会复制一份副本,这就是写时拷贝,也是子进程具有独立性的底层支撑。对一个进程来说,它看到的内存是一个从低地址到高地址连续的虚拟地址空间,而真实的物理内存可能是离散的,通过页表完成虚拟地址到物理地址的映射。- 进程独立性:每个进程都有自己独立的地址空间,修改一个进程的变量不会影响其他进程,即使变量的虚拟地址相同,映射的物理地址也不同。

2026-04-20 18:26:04 330

原创 深入解析Linux进程:PCB到状态流转

Z (EXIT_ZOMBIE) 僵尸状态 进程已终止,但父进程未读取其退出信息,PCB未释放 子进程先于父进程退出,父进程未调用 wait() / waitpid() 回收资源。- 等待队列( wait queue )用于管理阻塞状态的进程,如笔记中的 wait queue 等待队列,当事件发生时,内核会唤醒等待队列中的进程,将其移回运行队列。笔记标注的知识点:进程的task_struct等内核结构,在进程创建时申请,进程终止且父进程回收后释放,这是内核管理进程资源的核心逻辑。

2026-04-13 18:37:25 365

原创 Linux----进程概念

把父子任何一方进行修改进程,os把被修改的数据在底层拷贝一份,让目标进程修改这个代码(写时拷贝)CPU在数据层面,只和内存打交道,外设只和内存打交道(当代计算机时性价比的产物)1.软件运行,必须先加载 ,体系结构规定,程序运行之前,从磁盘到文件。是一款进行软硬件管理的软件:内核(进程管理,内存管理,驱动管理)我们历史上执行的所有指令工具,自己的程序,运行起来,全部都是进程。对上:与硬件交互,管理所有的软硬件资源(不是目的,是手段)子进程没有自己的代码和数据,因为目测,没有进程新加载。

2026-04-13 18:29:18 77

原创 算法篇二----二分查找

相等时,就是最终结果,无需判断,最坑人的就是,只要判断就会死循环,求中间值依旧是ret,ret不会移动,命中第。分析:a、x<t---->left = mid+1。细节处理:1>循环条件(left<right)分析:a、有结果 b、全大于t c、全小于t。以上就是二分查找的模型,再用几个例题加深理解。小技巧:当下面出现-1的时候,上面就+1。这就是本题思路,但是重点不在这里。c、x=t----->返回结果。细节问题:a、循环结束的条件。一、查找区间的左端点。查找区间左端点的模板。查找区间右端点的模板。

2026-04-06 11:18:32 69

原创 版本控制器Git/调试器gdb/cgdb使用

注: 如果有一些变量不应该修改,但是你怀疑它修改导致了问题,可以watch,如果变化了,就会通知你。给已有断点追加:condition 2 i ==30,其中2是已有断点编号,没有if。程序调试,必须是dugug模式,也就是编译时要加-g,gdb携带调试信息的exe。1、如何理解版本控制---->Git && gitee/github。f11:逐语句 ---------->step/s。f10:逐过程 ------->next/n。2>release---->测试----->上线。

2026-04-05 17:16:51 276

原创 make/m(M)akefile进度条

make命令扫描makefile文件的时候,从上向下扫描,默认形成第一个目标文件。二、makefile的基本概念--------依赖关系,依赖方法。这就是总是被执行,但是不建议将myproc使用PHONY。在缓冲区里,行刷新,程序退出,会自动刷新缓冲区!make是一个命令,makefile是一个文件。@:不会输出命令本身,只输出命令执行的结果。一个进度条,结合场景,边下载,边更新进度条。依赖关系----->只表面了依赖关系。Makefile的详细写法。三、进度条---命令行版本。Makefile的最终版。

2026-03-27 19:09:27 97 4

原创 Linux开发工具

我们自己的程序,会使用库中的方法 ---->两者链接起来------->形成可执行程序(让我们自己的程序能在库中找到方法,执行目标方法,需要跳转到库中执行完了,再返回)b、安装(就是拷贝)----->必须使用root权限----->安装到系统里,只要安装一次,任何人都能使用。静态链接:把我们程序中使用库的方法拷贝给自己,静态库只有在链接的时候有用,一旦形成可执行程序,静态库可不再需要。ctrl+r:撤销u操作(这两个,一旦退出文件编辑,无法再进行撤销了,但是只是保存没有进行q退出,可以撤销)

2026-03-24 21:22:21 384 3

原创 算法篇1-----双指针

6、输入一个递增排序的数组和一个数字,再数组中查找两个数,使得它们的和正好时s,如果右多对数字的和等于s,则输出任意一对。细节问题:不漏,找到一种结果,不要停,继续查找,当使用玩双指针算法之后,i也需要跳过重复的元素,注意避免越界。接下来也将进行算法的练习,先从简单的双指针开始,以8道列题来透彻理解算法双指针。c、在该数后面的区间内,利用双指针快速找到两个的和等于-target即可。dest:已处理的区间内,非0元素的最后一个位置。【1,0,2,3,0,4】此为特殊情况。定义两个指针,cur,dest。

2026-03-20 11:34:40 291 2

原创 vector模拟实现

这里的第二次打印,第一行应该是乱码,是因为调用了析构,释放了临时变量,出现了随机值,所以进行深拷贝,问题要出在memcpy里面,两个对象析构时,都会去delete[]同一块内存,程序崩溃,旧内存被释放,成了野指针,故改成如下格式。只要写了析构函数,就必须同时写拷贝构造函数和拷贝,来完成深拷贝,避免浅拷贝带来的崩溃和逻辑错误,不写构造则会默认生成,但是只要有构造函数就不会默认生成,所以不能值写拷贝构造,构造函数也必须写。由于数据挪动,p已经不是指向3,所以insert以后我们认为迭代器也失效了,不要访问。

2026-03-19 13:26:06 96 4

原创 Linux权限

eg.安装原件,安装到系统中,需要管理员root的权限--其实只安装了一份,允许大家同时使用。a、默认权限,由os自主决定,无法在创建前进行,系统可配置,可以灵活满足需要的一种表现。但是实际却会有偏差,那是因为系统默认存在一个叫做权限掩码的概念(umask)b、特殊情况下,配置umask,可以控制文件的默认权限,让代码在可控。希望凡是在umask中出现的权限,都不应该在最终权限中出现。要精细化的权限管理(文件类型),首选要有精细化的身份角色。6、如果我想进入对目录,没有r,就无法查看目录的文件。

2026-03-18 19:52:50 552 7

原创 Linux:基本指令

经过5个月的沉淀,C++的学习告一段落,额,勉强入门吧。本次分为两大点,进行讲解。7,ls -a -l 任何一个目录,即使是一个空目录,默认系统都会自带 . 和 .. 目录。任何一个Linux用户,用特定的用户名登录系统时,默认在家目录下,命令行比较接近os。压缩: 减少体积 减少体积,节省空间,网络转送,可以有效减少网络传送的时间。d : 目录文件 -> 不看后缀文本,可执行库,图片,视频。c: 字符文件,键盘,显示器,终端,输入的数据具有顺序性。一、指令(慢慢记,,不要死记,用的多了自然会记住)

2026-03-16 20:58:42 491 7

原创 多态(C++)

基类的析构函数为虚函数,此时派生类析构函数只需要定义,无论是否加virtual,虽不符合重写的规则,实际上编译器对析构函数的名称做了特殊处理,编译后析构函数的名称统一处理成destructor,故基类加virtual,就构成了重写。2>派生类由两部分构成,继承下来的基类和自己的成员,一般情况下,继承下来的基类中有虚函数表指针,自己就不会再生成虚函数表指针。在虚函数后面加上=0,不需要定义实现,只要声明即可。4>派生类的虚函数表中包含:基类的虚函数地址,派生类重写的虚函数地址,派生类自己的虚函数地址。

2026-03-09 20:50:06 493 8

原创 哈希算法:冲突解决与高效查找

需要注意每次初始化哈希表时,随机选取全域散列函数组中的一个散列函数使用,后读增删查改都固定使用这个散列函数,否则每次哈希都是随机选一个散列函数,那么插入是一个散列函数,查找又是另一个函数,就会导致找不到插入的key了。负载因子越小,哈希冲突的概率越小,空间利用率越低。开放地址法负载因子必须小于1,链地址法的负载因子就没有限制了,可以大于1,但为了哈希冲突概率低,空间利用率,大部分还是控制在1,大于1就扩容。假设N==100,[0,9999],哈希表的大小为M,那么通过key除以M的余数作为映射位置的下标。

2026-02-25 15:16:50 646 10

原创 string类的模拟实现

单参数隐式类型转换,字符串转为string,也是设为全局函数 的原因,若为成员函数,是一个const cha*不是string对象,无法调用成员函数。我们首先实现上面几个函数,要插入数据就要先检查空间是否足够,若不够,就要先进行扩容。其中_str_[size]='\0'一定不要忘记,不然会无限打印,报错。上一期讲解了STL的小知识点,这一期就进行string底层模拟实现。其中短小频繁调用的函数,就可以直接定义到类里面,默认是inline。走到这里发生了报错吗、,这里涉及了深拷贝的问题,需要写拷贝构造。

2026-02-14 17:02:05 502 15

原创 STL小知识点——C++

c的底层就是b,底层就是迭代器,都是指针。加上&可以修改值,不加则不能修改。auto自动推导,从s2中提取数字,字符赋值自动迭代,自动判断结束。提前开100空间,保留预留。境界:能用,明理,能扩展(能完成前两样就已经非常优秀了)这两个在vs中不会缩,在g++最多缩到size。const迭代器,只能读不能写/改。1、string类-管理字符串。eg2.字符串第一个唯一字符。eg1.将字符串反向输出。能做返回值,但谨慎使用。

2026-02-13 20:39:46 582 6

原创 红黑树(C++)

进一步分析,c是红色,p是红,g必是黑,这3个颜色就固定了,关键看u的变化,需要根据u分为以下几种情况分别处理。c红,p为红,g为黑,u不存在或者u存在且为黑;b、由规则2和3可知,任意一条路径不会由连续的红色节点,所以极端场景下,最长路径就是一黑一红间隔组成,那么最长路径就是2*bh。a、由规则4,从根到NULL节点的每条路径都有相同数量的黑色节点,所以极端场景下,最短路径就是全黑节点的路径,假设为bh。c、如果一个节点是红色的,则它的两个节点必须是黑色的,也就是说一条路径不会右连续的红色节点。

2026-02-11 20:40:43 6229 6

原创 AVL树:平衡二叉查找树的奥秘

AVL树自平衡,二叉查找树,左右子树都是AVL树,且左右子树的高度差的绝对值不超过1,通过控制高度差曲控制平衡。每个结点都有一个平衡因子,任何结点的平衡因子等于右子树的高度减去左子树的高度,任何平衡因子为0/1/-1。平衡因子=右子树高度-左子树高度,只有子树高度变化时才会影响当前节点的平衡因子,新增在右++,新增在左,--如图,只是进行简单的单旋不能够使AVL树平衡,所以必须进行双旋,这里以左右双旋进行演示。此为错误图形,结点10的右边高度为2左边为0,平衡因子为2,不平衡。a、保持搜索树的规则。

2026-02-10 11:55:51 329 6

原创 红黑树解析:map与set底层原理

其次multimap不支持[],因为支持key冗余[]只能支持插入了,不能支持修改。Key是map底层关键字的类型,T是map底层value的类型,set默认要求Key支持小于比较,如果不支持或者需要的话可以自行实现仿函数传给第二个模板参数,map底层存储数据的内存是从空间配置器申请的。b、如果k在map中,插入失败啊,但是insert返回pair对象的first是指key结点的迭代器,返回值同时[]返回结点中存储mapped_type值的引用,所以它具备查找+修改。·[]的功能有3个,插入,查找,修改。

2026-02-05 20:01:26 1577 11

原创 二叉搜索树(C++)

树的结构除了需要存储key还要存储对应的value,增/删/查还是以key为关键字走二叉树搜索树的规则进行比较,可以快速找到key对应的value。只有key作为关键词,结构中只要存储key即可,关键码即为需要搜索到的值,搜索场景只需要判断key在不在。key的搜索场景实现的二叉树搜索树支持增删查,但是不支持修改,修改key破坏搜索树结构。*若他的左子树不为空,则左子树上所有结点的值都小于等于根结点的值。*若他的右子树不为空,则右子树上所有结点的值都大于等于根结点的值。*它的左右子树也分别为二叉搜索树。

2026-02-04 18:45:34 278 2

原创 C++模板:代码复用的高效利器

这样会发生报错,这里的坑点就在与const ,本来要修饰T&,但这里的const修饰的却是Dtae*,所以一定要把const放在*之后(一定要注意指针)函数模板是一个蓝图,它并不是函数,是编译器用使用方式产生特定具体类型函数的磨具,所以其实模板本来应该我们做的重复的事情交给了编译器。另外类模板都是显示实例化,类模板的优点是可以直接使用多个栈,只要传不同类型即可,不像C语言,还得该命名,复制相同的代码,及其繁琐。在C语言中,一个项目可能会出现大量雷同的代码,但由于类型不同,不得不写很多代码,非常麻烦。

2026-01-30 17:06:09 918 5

原创 继承(C++)

继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许我们在保持原有类特性的基础上进行扩展,增加方法(成员函数)和属性(成员变量),这样产生新的类,称子类。*继承允许你根据基类的实现来定义派生类的实现。多继承:一个派生类有两个或以上直接基类是称中继承关系为多继承,多继承对象在内存中的模型是,先继承的基类在前面,后面继承的基类在后面,派生类成员在放到最后。a、基类的构造函数私有,派生类的构造必须调用基类的构造函数,但是基类的构造函数私有化后,派生类看不见就不能调用了,那么派生类就无法实例化出对象。

2026-01-28 18:32:25 658 4

原创 List链表实现

这个图的对比更能体现list和vector,string的区别,我们呢就像是list,没有先天的优势,只能靠自己一步一个脚印摸索,而有的孩子出生就是罗马,不要努力就可以得到我们这辈子拼尽全力都拥有不了的东西。随机 vector/string/deque ++/+/--/-先天不足,不像vector,string的数组结构,物理上是连续的。所有重点在于迭代器的实现。看下图,特殊处理,本来应该是两个->才合理,为了可读性,省略了一个。

2026-01-25 15:35:06 610

原创 C++小知识点(2)

1、如果一个类定义在另一个类的内部,这个内部类叫做内部类,内部类是一个独立的类,跟定义在全局相比,它只是受外部类类域的限制和访问限定符的限制,所以外部类定义的对象中不包含内部类。3、 本质也是一种封装,当A和B紧密相连,则如果放到private/protected位置,那么A是B的专属内部类,其他地方用不了。3、用static修饰的成员函数,称之为静态成员函数,静态成员函数没有this指针。4、静态成员函数中可以访问其他的静态成员,但是不能访问非静态,因为没有this指针。1、当输入A aa1=1;

2025-12-22 19:10:13 682

原创 C++小知识点

6、初始化列表中按照成员变量在类中声明顺序进行初始化,跟成员在初始化列表出现的先后顺序无关。这段代码先声明了_a2,先走,_a2(_a1),而此时_a1还未初始化,所以是随机值,再走,_a1(a),a是1则_a1的值为1。1、初始化列表以一个冒号开始,接着是以一个逗号分隔的数据成员列表,每个成员变量后面跟着一个放在括号中的初始值或表达式。2、const实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修饰。这依然是声明,不是定义,后面的1是缺省值 ,给初始化列表使用。

2025-12-18 20:40:37 713

原创 日期类实现

重载<<和>>时,需要重载为全局变量,this指针默认抢占了第一个形参位置,而第一个位置是左侧的运算对象调用时就变成了对象cout<<(如下图)+=是会改变自身,所以会与+进行区别,而+可以直接赋用+=的逻辑,且tmp是一个临时变量,只能作用在当前作用域,所以只能传值返回。如果是-=来赋用-的话会产生多次传值返回,也代表着有多次拷贝构造,而-赋用-=是没有传值的(两次拷贝,一次赋值,即3次拷贝)因为需要多次调用,所以直接定义在类成员函数中,默认是inline,节省空间。3、-=,-与+=,+雷同。

2025-12-18 10:05:15 411

原创 赋值重载拷贝

4、若一个重载运算函数是成员函数,则它的第一个运算对象默认传给隐式的this指针,因此运算符重载作为成员函数时,参数比运算少一个。8、重载操作符至少有一个类类型参数,不能通过运算符重载改变内置类型对象,eg.int operator(int x,int y)1、是一个运算符重载,规定必须重载成成员函数,其参数建议写成const当前类类型引用,否则会传值传参,会有拷贝。2、有返回值,且建议写成当前类类型引用返回,可以提高效率,目的是为了支持连续赋值场景。Date d4=d2;9、重载后要有价值有意义。

2025-12-17 17:37:32 907

原创 拷贝构造函数

6、传值返回会产生一个临时对象调用拷贝构造,传值引用返回,返回的是别名,没有产生拷贝,但如果返回对象是一个当前函数局部域的局部对象,函数结束就销毁了,使用引用返回有问题,这时的引用相当于一个野引用,类似野指针一样,传值引用返回可以减少拷贝,但一定确保返回对象,在当前函数结束后还在,才能引用返回。4、若未显示定义拷贝构造,编译器会自动生成拷贝构造,对内置类型成员变量会完成浅拷贝(一个字节一个字节的拷贝)每次要调用拷贝构造之前要先传值传参,传值传参是一种拷贝,又形成了一个新的拷贝,就形成了无限递归。

2025-12-14 15:51:35 675

原创 C++————构造函数,析构函数

无参构造函数、全缺省构造函数,我们不写构造时编译器默认生成的构造函数。定义:与构造函数相反,C++规定对象在销毁时会自动调用析构函数,完成对象资源中的清理工作(类似于Destroy)5、跟构造函数类似,我们不写编译器自动生成的析构函数对内置类型成员不做处理,自定义类型成员会调用他的析构。全缺省构造函数(与无参不能共存,构成函数重载,但是有调用歧义,因为参数不同)同时也代替了带参构造函数。定义:特殊的成员函数,名为构造。5、 如果类中没有显式定义构造函数,则编译器会自动生成一个无参的默认构造函数。

2025-12-08 20:53:45 484

原创 C++初阶(2)---引用,内联,空指针

对于 #define ADD (a b) ((a)+(b)),需要考虑太多,不能加分号,不能少括号,敲代码时候常常犯错,那就索性写成一个函数,建立栈帧,提高效率。nulptr是一个特殊的关键字,特殊类型的字变量,转化成任意其他类型的指针类型,nulptr只能隐式的转换成指针类型,而不能被转换成整数类型。从这个例子看出引用传参比指针传参更方便,故而引用的两大作用就是传参和做返回值,这也是祖师爷提出引用的主要目的。// 缩小权限只是缩小引用的权限,与原来的无关,1,先说最基础的引用,就是取别名的意思。

2025-12-04 09:33:32 586

原创 C++入门(1)

C语言中,如果变量名相同,优先输出局部变量(就近原则),如果想调用全局的同命名变量,就可以用namespace,调用符号为::,eg.zmx::,若只写::,则默认是全局。其中每个<< <<中只能有一个参数,相比于C语言,优点是可以自动识别变量的类型,cin>>a>>b>>c;由于C语言有很多不方便的地方,使用时要考虑很多问题,我们的祖师爷Bjarne Stroustrup就想创造一门新的语言,C++就此诞生。<<流插入 >>流提取。

2025-11-24 15:12:01 417 1

空空如也

空空如也

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

TA关注的人

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