- 博客(76)
- 收藏
- 关注
原创 应用层协议HTTP
URI是一种用于标识资源的字符串,它通过一种标准化的方式为资源提供一个唯一的名称或地址。URI是一种更广泛的标识符,它可以用来标识任何资源,包括文档、图片、视频、服务等。
2025-06-14 02:01:37
737
原创 Socket编程UDP\TCP
当服务器端的套接字在调用listen函数后进入监听状态时,它会等待客户端的连接请求。UDP以数据报的形式进行数据传输,每个数据报是一个独立的单元,包含完整的数据信息和目标地址信息。:每个数据报的大小有限制,通常不能超过64KB,否则可能会被网络分割成多个数据报,增加了数据丢失和乱序的风险。:减少了建立和维护连接的开销,使得数据传输速度更快,适合对实时性要求较高的场景,如网络视频会议、在线游戏等。UDP的协议头只有8字节,相比TCP的20字节(不包括选项)协议头,UDP的协议头更小,数据传输效率更高。
2025-06-05 21:59:35
1490
原创 网络基础概念
发送主机将发送缓冲区中的数据按照内存地址从低到高的顺序发送出去,接收主机则把从网络上接收到的字节依次按照内存地址从低到高的顺序保存到接收缓冲区中。MAC地址是被烧录在网卡中的,在网卡出厂时就已经确定了,不能修改,并且是唯一的(虚拟机中的MAC地址不是真实的MAC地址,可能会冲突)它将网络通信过程划分为七个层次,每一层负责不同的功能,从底层的物理传输到上层的应用服务。因此,网络数据流的地址规定为:先发送的数据对应低地址,后发送的数据对应高地址。:负责端到端的数据传输,确保数据的可靠性和完整性。
2025-05-15 00:09:26
1126
1
原创 Linux:线程同步与互斥
条件变量是一种在多线程编程中用于线程同步的机制,它允许线程在某些条件不满足时进入等待状态,直到条件满足时才被唤醒继续执行。互斥锁用于保护共享资源的访问,确保在多线程环境中,同一时间只有一个线程可以访问该资源,从而避免数据竞争和不一致的问题。2.如果多个线程同时要求执行临界区的代码,并且临界区没有线程在执行,那么只能允许一个线程进入该临界区。互斥:任何时刻,互斥保证有且只有一个执行流进入临界区,访问临界资源,通常对临界资源起保护作用。mutex:指向互斥锁的指针,该互斥锁必须已经被当前线程锁定。
2025-05-10 19:15:08
1021
原创 Linux:线程基础(虚拟地址,分页)
可以把单一页表拆分成1024个体积更小的映射表,这样一来1024(表的表项个数) * 1024(表的个数) = 4GB仍然能覆盖4GB的物理内存空间。这样的话,经过一段时间的运行,有的程序就会退出,它所占据的物理内存空间会被回收,这样就导致了这些物理内存很多都是以碎片的形式存在。在32位系统中,地址的长度是4字节的,那么页表的每一个表项就需要占用4个字节,所以页表占据的总空间大小就是。一个应用程序是不可能完全使用全部的4GB空间的,这样就可以让我们只需要部分的页表就能够让一个进程正常运行了。
2025-04-23 00:16:09
677
原创 Linux:进程信号
可以设置信号的处理函数、信号的阻塞行为以及信号的属性。handler是信号处理函数的指针,可以是三种情况之一(SIG_DFL(signum默认的信号处理方式)、SIG_IGN(忽略该信号)、自定义函数指针)每个信号在信号集中用一个位来表示,若第n位为1,则表示信号n在信号集中,若为0,则表示不在信号集中。set:指向要修改的新信号集的指针。阻塞和忽略是不同的,阻塞是信号不会被递达,而忽略是在信号递达之后可选的一种处理动作。被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作。
2025-04-22 00:27:14
811
原创 Linux:进程间通信
数据传输:⼀个进程需要将它的数据发送给另⼀个进程资源共享:多个进程之间共享同样的资源通知事件:⼀个进程需要向另⼀个或⼀组进程发送消息,通知它(它们)发⽣了某种事件(如进程终⽌时要通知父进程)进程控制:有些进程希望完全控制另⼀个进程的执⾏(如Debug进程),此时控制进程希望能够拦截另⼀个进程的所有陷⼊和异常,并能够及时知道它的状态改变。
2025-04-20 22:59:20
1092
原创 C++牛客题解:牛牛的快递(小数点的处理)
对于我们的题目来说,若是判断出了a为小数,则ret = 20 + ((int)a+1) - 1。1kg20元,2kg21元,所以最后结果为ret = 20 + kg数 - 1。我们可以定义一个tmp来存储a - (int)a,它的区间必定是[0-1)之间。因为我们将一个浮点数强行转为int类型的整数时,它必定会去除小数部分。不足1kg的部分按1kg算,所以我们需要把小数向上取整来处理。若是为整数,则ret = 20 + (int)a - 1。若tmp为0,则说明a是一个整数,否则说明a为一个小数。
2025-03-11 15:12:32
287
原创 Linux:文件系统(软硬链接)
文件 = 内容 + 属性而这个属性是存储在inode结构中的文件的数据都存储在“块”中,在Linux系统中还需要找一块地方来存储这个文件的信息(属性),这种存储文件信息的区域叫做inode,中文名为“索引节点”inode是保存文件属性的集合,一个文件只有一个inodels -l命令可以看到文件的详细属性,这些属性就是从inode中获取的inode内有一个唯一的标识符,叫做inode号,我们可以通过ls -i命令查看inode号。
2025-02-04 00:41:55
1144
原创 Linux:磁盘分区
一个文件可以是被打开的文件,也可以是未被打开的文件被打开的文件就是在内存中,未被打开的文件一般就是放在磁盘上的为什么要放在磁盘上呢?磁盘有什么优缺点?
2025-01-18 22:45:49
539
原创 Linux:基础IO
文件 = 文件内容 + 文件属性文件是存储在磁盘中的,磁盘是外设,磁盘上文件所有的操作本质都是对外设的输入和输出,简称IOLinux下一切皆文件所有的文件操作本质是文件内容操作和文件属性操作。
2024-12-27 22:29:13
1176
原创 C++:智能指针
当构造智能指针对象时来一份资源就要new一个引用计数,多个shared_ptr指向资源时就++引用计数即可,当shared_ptr析构时只需要--引用计数,当引用计数--到0后代表当前析构的shared_ptr是最后一个管理资源的对象,则析构资源。是C++11设计出来的智能指针,翻译是弱指针,他不同于上面的智能指针,他不支持RAII,也就意味着不能用他来直接管理资源,weak_ptr的产生本质是要解决share_ptr的一个循环引用导致内存泄漏的问题。n1和n2析构后,管理两个节点的引用计数减到1。
2024-12-21 17:59:34
832
原创 Linux:进程(环境变量、程序地址空间)
我们常见的计算机、服务器等大多数都遵守冯诺依曼体系输入设备:键盘、鼠标、摄像头、话筒、网卡、扫描仪等输出设备:显示器、磁盘、网卡、打印机等中央处理器(CPU):含有运算器和控制器等存储器:内存不考虑特殊情况;所有设备都只能和内存打交道正是因为有了冯诺依曼体系,让当代计算机成为了性价比的产物一般存储设备如CPU:存储量小,访问效率快,成本高如磁盘:存储量大,访问效率相对较慢,成本低所以有了内存这个中存储,中速度来调节二者,从而让计算机速度更快。
2024-12-14 21:37:13
900
原创 Linux:基础开发工具
CC=gccFLAGS=-oRM=rm -f.PHONY:clean:这些都是定义变量,这里定义了5个变量使用方法:$(变量名)这样也可以做到一样的效果,具体好处就和平时写代码的宏定义差不多。
2024-11-26 23:03:02
1179
原创 C++:异常
首先检查throw本身是否在try块内部,如果在则查找匹配的catch语句,catch语句若不匹配或throw不在try块内部,则退出当前函数,继续在外层调用函数链中查找匹配的catch语句,上述查找catch语句的过程被称为栈展开。如果到main函数,异常仍然没有被匹配就会终止程序,不是发生严重错误的情况下我们是不希望程序终止的,所以main函数中最后都会使用catch(...),它可以捕获任意类型的异常,但是不知道异常的错误是什么。程序的执行会从throw的位置跳到与之匹配的catch模块。
2024-11-23 17:18:30
675
原创 C++11(右值引用、可变参数、lambda、包装器)
在C++98中我们可以使用{}对一般的数组和结构体初始化C++11以后想统一初始化方式,试图实现一切对象皆可用{}初始化,它也叫做列表初始化内置类型支持,自定义类型也支持,自定义类型的本质是类型转换,中间会产生临时对象,优化以后可以变成直接构造{}初始化的过程中,可以省略掉=
2024-11-14 23:34:22
935
原创 C++:unordered_set、unordered_map类
unordered_set和unordered_map的底层是哈希桶实现的,使用方法和set/map都差不多所以它们的增删查平均效率是O(1)
2024-11-05 23:03:48
718
原创 C++:哈希表
从发生冲突的位置开始,依次左右按二次方跳跃式探测,直到寻找到下一个没有存储数据的位置为止,如果从右走到哈希表尾,则回绕到哈希表头的位置,如果往左走到哈希表头,则回绕到哈希表尾的位置。哈希表里只需要存储一个指针,当没有数据映射这个位置时,指针为空,当有多个数据映射这个位置时,我们把这些冲突的数据链接成一个链表,挂在哈希表当前位置的下面。这是扩容的逻辑,因为哈希表为了减少哈希冲突,哈希表的容量需要尽可能的是素数,所以这里写了一个函数列了一个素数表来拿到下一个接近2倍并且是素数的值。
2024-11-01 00:22:45
901
原创 C++:map和set类
string、vector、list、deque、array、forward_list,这些容器统称为序列式容器这些容器存储之间的值一般没有紧密的关联关系,比如交换一下,它依然是序列式容器map、set这些系列的就是关联式容器,两个位置有紧密的关联关系,交换一下它的结构就被破坏了map和set的底层是红黑树set是key搜索场景的结构map是key/value搜索场景的结构。
2024-10-25 23:45:20
382
原创 C++:红黑树
红黑树也是一颗搜索二叉树,它每个节点的颜色不是红色就是黑色,所以叫做红黑树它可以确保没有一条路径比其他路径长出2倍,因此它接近平衡。
2024-10-15 23:40:05
908
原创 C++:AVL树
AVL的本质就是一棵二叉搜索树,但是二叉搜索树若是高度不平衡,它的搜索速度就会大打折扣,AVL树就是优化的二叉搜索树,它能让整颗树的高度差不超过2,这样我们搜索起来的效率就是O(logN)新增节点后,影响到的是新增节点祖先节点的高度,所以我们更新平衡因子需要从parent节点开始持续往上更新调节,什么时候停止需要分情况讨论。当parent的平衡因子为-2,左子树的平衡因子为1,这时候单单的一次旋转是无法让这棵树平衡的。parent的平衡因子为-2,并且它的左节点的平衡因子为-1,则需要右单旋。
2024-10-07 23:11:24
1086
原创 Linux:常用指令
ls [选项][目录或文件] (可以不带选项和目录表示当前目录):对于目录,该命令列出该目录下的所有子目录与文件。对于文件,将列出文件名以及其他信息。-a列出目录下的所有文件,包括以开头的隐含文件。-d将目录象文件一样显示,而不是显示其下的文件。如:ls –d指定目录-i输出文件的i节点的索引信息。如ls –ai指定文件-k以k字节的形式表示文件的大小。ls –alk指定文件-l列出文件的详细信息。-n用数字的UID,GID代替名称。(介绍UID。
2024-09-25 09:20:57
691
原创 C++:多态(协变,override,final,纯虚函数抽象类,原理)
如果派生类继承后不重写虚函数,那么该派生类也是抽象类纯虚函数某种程度上强制了派生类重写虚函数,因为不重写就无法实例化出对象。
2024-09-21 23:31:06
910
原创 C++:继承(protected、隐藏、不能被继承的类、)
继承是面向对象语言程序设计使代码可以复用的最重要的手段,它允许我们在保持原有类的特性基础上进行扩展,增加成员函数或者成员变量,这样产生新的类称为子类。3. 子类的operator=必须要调用父类的operator=完成父类的复制,需要注意的是它们两个构成隐藏关系,子类调用时需要指定父类作用域。当父类的构造函数私有时,子类的构成必须要调用父类的构造函数,但是私有化后,子类看不见,所以就不能调用了,子类就无法实例化出对象。继承⼀定程度破坏了父类的封装,父类的改变,对子类有很大的影响。
2024-08-22 23:47:16
1372
原创 C++:模板 II(非类型模板参数,特化,分离编译)
这时候把p1和p2传进去比较的不是它指向的内容,而是比较的地址,所以这个比较是随机的也是错误的!顾名思义,它的类型形参并不是一个类型,就是用一个常量来作为类模板或函数模板的一个参数。这时候我们就可以让前面的Date*指针走我们特化的这个函数,结果就正确了。这个特化是特化为了指针,所以若是调用的指针类型就会调用到这个模板。4. 函数形参的类型必须要和特化的类型相同,如果不同编译器会报错。这个特化是特化为了引用,所以若是调用的引用类型就会调用到这个模板。3. 函数名后面跟一个,中指定需要特化的类型。
2024-08-21 22:32:16
866
原创 C++:priority_queue类
priority_queue类的本质是堆,下面是数据结构中的实现C数据结构:堆(实现、排序)-优快云博客它的实现也是和前面的栈和堆类似,一样用其他容器的成员函数来实现。
2024-08-20 23:42:31
466
原创 C++:queue类
queue类就是数据结构中的队列C数据结构:队列-优快云博客queue的性质还是FIFO先进先出queue类和stack类大的实现方式不一样,但是可以说是大差不差,都是复用其他容器来完成类C++:stack类(vector和list优缺点、deque)-优快云博客。
2024-08-18 21:37:40
484
原创 C++:stack类(vector和list优缺点、deque)
stack类就是数据结构中的栈C数据结构:栈-优快云博客stack类所拥有的函数相比与string、vector和list类都少很多,这是因为栈这个数据结构是FIFO先进先出的,它必须被有所限制,所以所能用的函数只需要那几个足矣栈可以用顺序表来实现,也可以用链表来实现,我们只需要控制它先进先出的特性即可,用什么容器实现取决于个人因为我们前面实现了vector和list类,所以再实现stack类就容易很多了,只需要复用vector和list容器内的函数即可。
2024-08-17 18:10:11
996
原创 C++:vector类(default关键字,迭代器失效)
vector其实就是数据结构中的顺序表,建议先学会顺序表C数据结构:顺序表-优快云博客public:private:这个iterator其实本质就和上一节string类的iterator一致,只不过这里是T*C++:string类(auto+范围for,typeid)-优快云博客有iterator就顺带把const_iterator定义了,方便稍后实现const迭代器的函数既然有了迭代器,那么begin和end也就很容易实现出来了。
2024-08-14 01:31:10
934
原创 C++:string类(auto+范围for,typeid)
string是一个字符串类string类和数据结构中的顺序表非常相似,只要我们懂了顺序表那么string类也是手拿把掐了C数据结构:顺序表-优快云博客为什么要有string类?和我们平时使用的 "内容"有什么区别?string类有非常多的接口,比如size,substr等等,这些都可以直接的帮助我们完成所需对字符串的改变在学习STL模板之前,我们还需要了解两个前置知识。
2024-08-08 00:31:19
1002
原创 C++:内存管理(new,delete)
在C/C++中,都有一块虚拟地址,内部井然有序的将代码分成了几部分,如下表:栈:又叫堆栈,存放着非静态局部变量、函数参数、返回值等,栈是向下生长的内存映射段:是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享内存,做进程间通信堆:用于程序运行时动态内存分配,栈是向上生长的数据段:存储全局数据和静态数据代码段:存储可执行代码、只读常量。
2024-07-22 18:13:48
994
1
原创 C++:类和对象 III(初始化列表、explicit、友元、匿名对象)
这两种写法给我们带来的效果都是一样的,但是无论怎么写我们的成员变量都要经过初始化列表一遍,就算没有写初始化列表也会!这里就是由于编译器的优化,由于A a2 = a1这个表达式做了两件事情,一件就是构造,另一件就是拷贝构造,所以编译器优化成了只有拷贝构造即可。这是因为类声明是先声明的_b,才声明的_a,所以初始化列表会先初始化_b,再初始化_a,而不是因为_a在初始化列表中初始化就初始化_a。那就是在初始化列表中!初始化列表中按照成员在类中声明的定义来初始化,于初始化列表中出现的先后顺序无关。
2024-07-18 23:24:15
1116
原创 C++:类和对象 II(默认成员函数,深浅拷贝)
浅拷贝是字节的拷贝,那么这个st1指针的字节也会被另一个对象st2所拷贝,这时候如果析构函数我们需要释放空间st1的空间,那么会根据_a的指向来free(_a),这时候st1的空间已经被销毁,总所周知,在C语言中如果我们写了一个日期类,如果我们想要在我们自己的类定义出的对象里面进行加减乘除法明显是不行的,你自己定义的类怎么能加减呢?如果别人需要使用我们的类,我们不想给他们使用,或者有别的意思,我们是可以恶搞一下的,取地址运算符重载,把地址变成一些莫名其妙的数字。
2024-07-15 15:00:47
921
原创 C++:类和对象 I(访问限定符、this指针)
class就是类,class是C++中的一个关键字当然类也可以是C语言中的struct,C++兼容struct,甚至还有一些升级定义类的方式class Date和C语言的struct一样,class是C++中定义类的一个关键字,Date是这个类的名字,我们需要在后面跟上一个 {}和;,{}里面可以放变量,函数等定义在类里面的成员函数默认为inline。
2024-07-12 17:56:34
1249
原创 C++:入门基础
因为编译器不能随意的展开一段代码,假设我们的func函数有1000条代码来完成,但是我们在main函数或者其他地方调用了func函数100次,全部都展开的话就是1000*100的代码量,这样会使我们的内存负担极大,相反,不展开的话只需要一个个call func函数的地址即可。上图的a是被const修饰的,只可读不可写,没有const限制的b自然也无法变成a的别名,因为b是可读可写,如果可以引用的话那a的权限就相当于被b放大了,这是不被允许的。
2024-07-10 20:57:25
1057
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人