- 博客(24)
- 收藏
- 关注
原创 传输层 -- TCP协议
TCP复杂的原因就是既要保证可靠性又要尽可能地提高性能校验和序列号(按序到达)确认应答超时重发连接管理流量控制拥塞控制滑动窗口快速重传延迟应答捎带应答其他还有定时器(超时重传定时器、保活定时器,TIME_WAIT定时器等)基于TCP的应用层协议:HTTP、HTTPS、SSH、Telnet、FTP、SMTP,也包括我们自己写TCP程序时自定义的应用层协议。
2025-09-17 09:57:45
1145
原创 网络层 -- IP协议
在传输层TCP协议提供了可靠传输的策略。但是我们还需要提供数据跨网络传输的能力,这就是IP协议的工作。要将数据从A主机跨网络运输到B主机就必须清除源主机和目标主机,这就需要对每台主机进行标识。再打个比方,我们旅游去某个地方的时候,都是先定位目标城市,再定位城市中的具体地点。目标城市就像网络,具体地点则是该片网络中的某个具体主机。即数据传输应该是先去往目标网络,再找到目标主机。所以 ip = 目标网络 + 目标主机。IP协议就提供了在复杂的网络环境中确定一个合适的路径的能力。
2025-09-14 17:09:41
781
原创 Linux -- 文件描述符和重定向
pathname:要打开或创建的目标文件flags:打开文件时,可以传入多个参数选项O_RDONLY:只读打开O_WRONLY:只写打开O_RDWR:读,写打开以上三个常量(宏)必须指定一个并且只能指定一个O_CREAT:若文件不存在,则创建它。需要使用mode选项来指明新文件的访问权限O_APPEND:追加写成功:新打开的文件描述符失败:-1。
2025-06-21 21:38:51
1116
原创 Linux -- 进程地址空间
我们在学习C/C++语言的时候都了解过程序地址空间的布局,大家应该都见过这张图:我们怎么验证这张图的内存分布是正确的呢?运行结果如下:将两张图放在一起对比,确实是按照图上地址由低到高布局的:并且我们发现堆区和栈区之间间隔非常大的内存这段程序运行时会发生错误,原因就是我们对只读的str进行了修改:这里观察运行结果时先不要对在代码中对str加上const修饰 ,因为const在编译阶段生效,程序编不过,不会形成可执行程序。
2025-05-29 14:31:27
913
原创 C++11 -- lambda表达式
随着C++语法的发展,人们开始觉得上面的写法太复杂了,每次为了实现一个algorithm算法,都要重新去写一个类,如果每次比较的逻辑不一样,还要去实现多个类,特别是相同的命名,这些都给变成这带来了极大的不便。实际在底层编译器对于lambda表达式的处理方式,完全就是按照函数对象的方式处理的,即:如果定义了一个lambda表达式,编译器会自动生成一个类,在该类中重载了operator().函数对象,又称仿函数,即可以像函数一样使用的对象,就是在类中重载了operator()运算符的类对象。
2025-05-09 10:54:38
722
原创 C++ -- 哈希扩展
找到只出现一次的整数与判断在与不在不同的地方在于判断在不在只需要一个比特位,1代表存在,0代表不存在。布隆过滤器的思想是将一个元素用多个哈希函数映射到一个位图中,因此被映射到的位置的比特位一定为1.所以可以按照以下方式进行查找:分别计算每个哈希值对应的比特位只存储的是否为0,只要有一个为0,代表该元素一定不在哈希表中,否则可能在哈希表中。布隆过滤器如果说某个元素不存在时,该元素一定不存在,如果该元素存在时,该元素可能存在,因为有些哈希函数存在一定的误判。给40亿个不重复的无符号整数,没排过序。
2025-05-07 12:50:17
2144
原创 C++ 项目 -- 高并发内存池
该项目实现的时一个高并发的内存池,原型是google的开源项目tcmalloc(Thread-Caching Malloc),即线程缓存的malloc,实现了高效的多线程内存管理,用于替代系统的内存分配相关函数(malloc、free)。在此仅把tcmalloc最核心的框架简化出来模拟实现一个自己的高并发内存池。相关知识概念:C/C++、链表、哈希桶、操作系统内存管理、单例模式、多线程、互斥锁。
2025-05-06 17:00:10
1169
1
原创 C++ -- 继承
之前我们在编写代码时,常常把一个频繁使用的操作封装成函数,方便我们后面直接调用函数即对函数进行复用。而继承与函数的复用有一些相似之处:继承是类设计层次的复用,允许程序员在原有类特性的基础上进行扩展。// 派生类 继承方式 基类protected:int _stuid;// 派生类 继承方式 基类protected:int _jobid;Person是父类,也叫做基类;Student是子类,也叫做派生类。
2025-04-22 14:46:19
1023
原创 C++ -- 哈希表
优点:实现非常简单缺点:一旦发生哈希冲突,所有的冲突连在一起,容易产生数据“堆积”,即:不同关键码占据了可利用的空位置,使得寻找关键码的位置需要许多次的比较,导致搜索效率降低。
2025-03-28 13:01:16
1973
原创 C++ -- 红黑树模拟实现map和set
根据现有了解,我们知道set中存储的应当只有key,而map中存储的应该是<key, value>的键值对,但实际是这样吗?我们去库中(stl_set.h)查看相关定义(此处省略了部分代码,不影响理解):上图分别是库中关于set、map和红黑树的相关定义。并不像我们想的那样,set中也有key_type和value_type,但实际上两者的类型都是Key;
2025-03-23 21:44:16
900
原创 C++ -- 红黑树
红黑树是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色可以是Red或Black。通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出两倍,因而是接近平衡的。
2025-03-21 16:01:47
1937
原创 C++异常
我们已经知道,抛出的异常可能是不同类型的,那当存在很多可能抛异常的函数时,难道外层要写无数个与其匹配的catch语句来捕获吗?想想都觉得很麻烦。实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理,大家抛出的都是继承的派生类对象,这样捕获一个基类,再重写函数就可以了。基类Exception:一般包括错误信息和错误码public:,_id(id){}protected://错误信息int _id;
2025-03-17 16:26:11
850
原创 二叉搜索树实现
我们曾经使用二分查找法在数组中找数,但是由于数组的地址空间是连续的,在对其进行数据的插入和删除时需要大量挪动数据,造成效率的损失;而如果在链表中找数,虽然进行数据的插入删除操作的效率大大提升,但查找的效率又变得很低,由此诞生了取二者长处的二叉搜索树。注意:二叉搜索树也可以是一颗空树。
2025-03-14 21:22:43
914
原创 类和对象(下)
例题:实现一个类,计算程序中创建出了多少类对象思路:统计构造函数和析构函数调用的次数来计算,当前对象的数量大概是构造函数(包括拷贝构造函数)调用的次数与析构函数调用的次数差。
2025-02-25 16:32:03
897
原创 C++——类和对象(中)
因为赋值运算符重载也是默认成员函数,如果我们不显式实现,编译器会生成一个默认的,此时如果在全局内实现复制运算符重载就会和编译器在类重生成的默认运算符重载产生冲突,并且全局函数不存在this指针。相同的,如果用户没有显式地定义,编译器会生成默认的拷贝构造函数,但是默认的拷贝构造函数对象按内存存储按字节序拷贝,是一种浅拷贝/值拷贝。(注意我们之前提到的,成员函数第一个隐含参数为this指针,指向当前调用函数的对象,所以这里的Less函数只需要写一个参数,即与当前对象进行比较地另一个对象)
2025-02-23 23:00:37
591
原创 C++——类和对象(上)
我们在C语言中学过结构体struct,当时只能用结构体定义变量。而在C++中结构体被升级为了类,不仅可以在其中定义变量,还可以定义函数并且在C++中更喜欢把这样的结构体替换为classclass即为定义类的关键字,其格式为:class 类名//类体//定义成员变量和成员函数类的定义有两种方式:1.声明和定义全部放在类体中public:int _age;2.声明和定义分离//.h文件——声明int _age;//为了能将成员变量和成员函数的形参区分开。
2025-02-22 11:11:58
788
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅