- 博客(56)
- 收藏
- 关注
原创 【全局教学】手把手教你做一个muduo服务器
本文详细介绍了如何实现一个基于C++的高性能HTTP服务器,涵盖了从基础模块到完整服务器实现的各个部分。首先,文章介绍了时间轮、正则表达式和通用类型Any的实现,这些是服务器开发中的基础工具。接着,文章详细讲解了服务器模块的实现,包括缓冲区管理、日志宏、套接字模块、事件管理、描述符事件监控、定时任务管理、Reactor-EventLoop线程池等核心组件。随后,文章深入探讨了HTTP协议支持模块的实现,包括实用工具类、HTTP请求和响应类的设计,以及HTTP上下文的管理。最后,文章展示了如何将这些模块整合成
2025-05-18 17:49:36
1034
原创 python基础语法
元组和列表相比,是非常相似的,只是列表中哪些元素可以修改调整,元组中放的元素是创建元组的时候就设定好的,不能修改调整。需要注意的是,input的返回值是用户输入的内容,是字符串类型,如果希望通过输入来进行加法运算, 需要转换类型。需要注意的是,字典本质是哈希表,哈希表的key要求是'可哈希的',也就是说可以计算出一个哈希值。在python中,一个变量的类型,是可以在程序运行的过程中变化的,这点和其他语言不同。在调用函数的时候,需要给函数制定实参,一般默认情况是按照形参的顺序,来依次传递实参的。
2024-09-07 12:44:24
1575
1
原创 C++学习第十三天(多态)
多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。必须通过基类的指针或者引用调用虚函数被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写三个概念的对比重载两个函数在同一作用域函数名/参数相同重写(覆盖)两个函数分别在基类和派生类的作用域函数名/参数/返回值都必须相同(协变除外)两个函数必须是虚函数重定义(隐藏)两个函数分别在基类和派生类的作用域函数名相同两个基类和派生类的同名函数不构成重写就是重定义。
2024-05-09 11:54:40
765
原创 C++学习第十一天(模版进阶)
一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式。
2024-05-06 23:12:57
367
原创 C++学习第九天(list及其模拟实现)
概念:迭代器失效即迭代器所指向的节点无效,即该节点被删除了,因为list的底层结构是带头节点的双向循环链表,因此在list中进行插入时是不会导致list的迭代器失效的,只有在删除的时候才会失效,而且失效的只是指向被删除节点的迭代器,其他迭代器不会受到影响。list中的接口比较多,一下是常见的重要接口。
2024-04-24 16:14:41
620
原创 C++学习第十天(stack和queue)
队列是一种容器适配器,其中从容器一端插入元素,另一端提取元素队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列底层容器可以是标准容器类模版之一,也可以是其他专门设计的容器类。该底层容器应至少支持以下操作empty:检测队列是否为空size:返回队列中有效元素的个数front:返回对头元素的引用back:返回队尾元素的引用push_back:在队列尾部入队列。
2024-04-10 15:31:53
601
原创 Linux学习第六天(进程)
任何计算机系统都包含一个基本的程序集合,称为操作系统,操作系统包含内核和其他程序。与硬件交互,管理所有的软硬件资源;为用户程序(应用程序)提供一个良好的执行环境一款纯正的“搞管理”的软件计算机管理硬件:先描述再组织,描述是用struct结构体,组织是用链表或其他高效的数据结构在开发角度,操作系统对外会表现为一个整体,但是会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口,叫做系统调用。系统调用在使用上,对用户的要求比较高,所以开发者可以对部分系统调用进行适度封装,成为了库,便于用户进行开发程序
2024-04-08 12:56:45
698
原创 Linux学习第四天(makefile、make)
makefile是文件,make是命令1、目标就是需要生成的文件,如果目标文件的更新时间晚于依赖文件的更新时间,则说明依赖文件没有改动,目标文件不需要重新编译,否则会进行重新编译并且更新文件2、依赖:即目标文件由哪些文件生成3、命令:即通过执行命令由依赖文件生成目标文件。注意每条命令之前必须有一个(此文档编辑器默认是空格,复制下来的代码需要把命令代码的缩进改为tab制表符)保持缩进,这是语法要求(会有一些编辑工具默认tab为4个空格,会造成Makefile语法错误)。
2024-04-03 16:21:20
319
原创 C++学习第八天(vector)
erase删除pos位置元素后,pos位置之后的元素会往前搬移,没有导致底层空间的改变,理论上讲迭代器不应该会失效,但是:如果pos刚好是最后一个元素,删完之后pos刚好是end的位置,而end位置是 没有元素的,那么pos就失效了。迭代器的主要作用就是让算法能够不用关系底层的数据结构,其底层实际是一个指针,或者就是对指针进行了封装,比如:vector的迭代器就是原生态指针T*,因此迭代器失效,实际就是迭代器底层对应指针所指向的空间被销毁了,而使用一块已经被释放的空间,会使程序崩溃。
2024-04-01 09:36:29
525
原创 Linux学习第三天(gcc/g++的使用、gdb的使用)
比如说:我们只使用的 stdio.h 中只包含了对于printf函数的声明,却没有说明对该函数的实现,那么系统是怎么实现printf函数呢?gdb binfile 退出:ctrl+d或quit调试命令。实例:gcc hello.o -o hello。在成功编译之后,就进入了链接阶段。
2024-03-27 16:46:50
982
原创 C++学习第六天(模版初阶)
class 类模版名//类内成员定义//动态顺序表//注意:vector不是具体的类,是编译器根据被实例化的类型生成具体的模具public:, _size(0){}//使用析构函数演示:在类中声明,在类外定义~Vector();//注意:类模版只函数放在类外进行定义时,需要加模版参数列表。
2024-03-03 16:49:20
411
原创 C++学习第五天(内存管理)
int main()//new/delete 和 malloc/free 最大的区别是new/delete对于[自定义类型]除了开空间还会调用构造函数和析构函数free(p1);delete p2;//内置类型几乎是一样的free(p3);delete p4;free(p5);return 0;
2024-03-03 13:08:47
924
原创 C++学习第四天(类与对象下)
定义时不添加static关键字,类中只是声明3、类静态成员即可用类名::静态成员 或者 对象.静态成员来访问4、静态成员函数没有隐藏的this指针,不能访问任何非静态成员5、静态成员也是类的成员,受到public、protected、private访问限定符的限制。
2024-03-01 23:05:07
1924
原创 Linux学习第二天(yum、vim工具)
使用这段指令之后可以罗列出可以安装的软件包,这里罗列出的含lrzsz这个词的软件包,如:这里有几点需要注意:举个安装lrzsz的例子:yum可以找到需要下载的软件包,再敲y确定安装,当出现complete时才能说明安装完成 举个卸载lrzsz的例子:vim有三种模式:命令模式、插入排序、底行模式命令模式:控制屏幕光标的移动,字符,字或者行的删除,移动复制某区段及进入插入模式下,或者到底行模式下插入模式:只有在插入模式下,才可以进行文字的输入,按【ESC】才可以返回到命令行模式底行模式:文件保存或者退出,也可
2024-02-26 08:25:53
1838
原创 C++学习第三天(类与对象中)
默认函数的概念:用户没有显式实现,编译器会自动生成的成员函数被称为默认成员函数,即使这个类是空类,也会有默认函数在里面,只不过我们是看不到的。
2024-01-30 18:05:01
893
原创 C++学习第一天(入门学习)
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。//1.正常的命名空间定义//命名空间中可以重新定义变量、函数、类型int val;//2、命名空间可以嵌套int a;int b;int c;int d;//3、同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中//比如我在test.h上写一个同样的namespace,最后会和test.cpp的合成一个namespace。
2024-01-25 15:44:41
2340
原创 Linux学习第一天(常见指令)
语法:ls[选项][目录或文件]功能:对于目录,该命令列出该目录下的所有文件。对于文件,将列出文件名以及其他信息。
2024-01-19 17:04:21
923
原创 C语言学习第二十七天(单链表)
概念:链表是一种物理结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。3、从堆上申请空间,是按照一定的策略来分配的,两次申请的空间可能连续,也可能不连续。但是我们常用的链表是:无头单向非循环链表和带头双向循环链表。1、链式结构在逻辑上是连续的,但是在物理上不一定连续。2、现实中的结点一般是从堆上申请出来的。接下来写一下每一个函数的实现代码。
2023-12-18 21:09:25
396
原创 C语言学习第二十六天(算法的时间复杂度和空间复杂度)
衡量一个算法的好坏,是从时间和空间两个方面来衡量的,换句话说就是从时间复杂度和空间复杂度来衡量的是衡量一个算法的运行快慢,是主要衡量一个算法运行所需要的。
2023-12-18 00:08:33
985
原创 C语言学习第二十五天(顺序表)
首先顺序表的底层结构是数组,对数组的封装,实现了常用的增删改查等接口。这个静态顺序表还是有缺陷的,空间少了不够用,空间给多了造成空间浪费。即使用定长数组存储元素。3、动态顺序表的实现。
2023-12-17 19:16:57
410
原创 C语言学习第二十四天(预处理)
举个例子#define reg register //为register这个关键字创建一个简短的名字;case //这样可以在写case语句的时候自动补上break//如果定义的stuff过长,可以分成几行写,除了最后一行外,每一行的后面都要加一个反斜杠(续写序)并且,需要注意的是,在define定义标识符的时候,最好不要在最后加上;否则容易导致错误#define 机制还有一个规定,允许把参数替换到文本当中,这种实现通常称为宏或者是定义宏。
2023-12-14 21:32:35
898
原创 C语言学习第二十三天(文件操作)
每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(比如文件的名字,文件的状态以及文件当前的位置等)。stdin、stdout、stderr三个流的类型是:FILE*,称之为文件指针,C语言中,就是通过FILE*的文件指针来维护流的各种操作的。每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,使用者不必关心细节。在编写程序的时候,在打开文件的同时,都会返回一个FILE*的指针变量指向该文件,也相当于建立了指针和文件的关系。
2023-12-14 08:05:32
861
原创 C语言学习第二十二天(动态内存管理)
当是第二种情况的时候,原有的空间因为没有足够的空间时,扩展的方法是:在堆空间上另外找一个合适大小的连续空间来使用。这样的函数返回的是一个新的内存地址。这道题本来的意思是想让str的地址换成p的地址,然后打印出来这个字符串,但是这个GetMemery函数中p被开辟之后就会被销毁,所以打印出来是一堆乱码,我们可以在char *p前面加上static,就可以正常打印出来了。这道题目运行出来结果是正确的,与前面不同,在调用GetMemory这个函数的时候,传过去的是二级指针,所以就可以在str所在的位置开辟内存。
2023-12-13 11:26:55
824
原创 C语言学习第二十一天(自定义类型:结构体)
4、如果出现了嵌套结构体的情况,嵌套的结构体成员对齐到自己的成员中最大对齐数的整数倍 处,结构体的整体大小就是所有的最大对齐数(含嵌套结构体中成员的对齐数)的整数倍。在上面的代码的基础上,这样写是不合法的,原因是:编译器会把上面的两个声明当成是完全不同的两个类型,所以是非法的。原因是,为了访问未对齐的数据,处理器需要作两次访问,但是对齐的数据只需要一次访问。这样是不行的,因为Node是对前面的匿名结构体类型的重命名产生的,但是在匿名结构体内部提前使用Node类型来创建成员变量,这样是不行的。
2023-11-30 11:37:39
379
原创 C语言学习第二十天(数据在内存中的存储)
首先看(int *)(&a+1),&a得到的是整个数组的地址,+1就会跳过整个数组的地址跑到数组中4这个元素后面的一个位置,打印的是ptr1[-1],等效于打印*(ptr-1)得到的结果是4,*ptr2的结果要稍微复杂一点,首先,在小端存储当中存储的数组为01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00,将a的地址转化为整形后再+1,地址从01 向后移动一位到00,从00读取到的是00 00 00 02,所以最后得到的结果是20 00 00 00。
2023-11-29 15:55:34
851
原创 C语言学习第十九天(C语言内存函数)
函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。如果source和destination有任何的重叠,复制的结果都是未定义的。memset函数是用来设置内存的,将内存中的值以字节为单位设置成想要的内容。比较从ptr1和ptr2指针指向的位置开始,向后的num个字节。对于重叠的内存可以交给memmove来处理。4、memcmp函数的使用。memmove的模拟实现。
2023-11-28 23:13:34
388
原创 C语言学习第十八天(字符函数和字符串函数二)
这个函数和perror函数有一定的相似之处,perror函数相当于一次将上述代码的第九行完成了,直接将错误信息打印出来。strtok函数找到str中的下一个标记,并将其用\0结尾,返回一个指向这个标记的指针(strtok函数会改变被操作的字符串,所以在使用strtok函数切分字符串一般都是临时拷贝的内容并且可以修改)strtok函数的第一个参数不为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记。使用这个函数,需要使用errno.h这个头文件,下面是使用这个函数来得到错误信息的代码。
2023-11-28 21:35:14
397
原创 C语言学习第十七天( 字符函数和字符串函数)
比较str1和str2的前num个字符,如果相等就继续往后面找,最多比较num个字符,如果提前发现不一样就提前结束,大的字符所在的字符串大于另外一个。如果sourse指向的字符串的长度小于num的时候,只会将字符串中到\0的内容追加到destination指向的字符串末尾。将sourse指向的字符串的前num个字符追加到destination指向的字符串末尾,再追加一个\0字符。如果源字符串的长度小于num,则拷贝完字符串后,在目标的后面追加0,直到num个。会将字符串中的'\0'拷贝到目标空间。
2023-11-24 08:37:58
360
原创 C语言学习第十六天(指针部分六)
然后*(ptr1-1)会使指针向前面移动一位,得到的就是10,aa是指首元素的地址,也就是第一行元素的地址,+1之后跳过一行,指向6的位置,所以*(ptr2-1)会指向5的位置。这是一个5*5的二维数组,p是数组指针,指向的数组4个int类型的元素,p[0]与p[1]会相差4个字节,以此类推,最后将两指针相减,得到的是两个指针元素的个数,这里计算出来是4个,然后打印出来的是补码来推出结果。首先这个是逗号表达式,这个二维数组存储的数据是1 3 5 0 0 0,所以p[0]得到的是1。
2023-11-23 13:22:01
50
原创 C语言学习第十五天(指针部分五)
这函数统计的是从strlen函数的参数str中的这个地址开始向后,\0之前字符串中字符的个数。strlen函数会一直向后找\0字符,直到找到为止,所以可能存在越界查找。sizeof计算的是变量所占内存内存空间的大小,单位是字节,如果操作数是类型的时候,计算的是使用类型创建的变量所占内存空间的大小。使用回调函数,模拟实现qsort(这里采用冒泡的方式,库函数当中采用的是快速排序的方式)sizeof只关注占用内存空间的大小,不在乎内存中存放的是什么数据。2、sizeof和strlen的对比。
2023-11-20 07:52:43
55
原创 C语言学习第十四天(指针部分四)
如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,被调用的函数就是回调函数,回调函数不是由该函数的实现方直接使用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。那么把函数的地址存储到一个数组当中,那这个数组就叫函数指针数组,那函数指针的数组如何定义呢?parr1先和[]结合,说明parr1是数组,数组的内容是:int (*)()类型的函数指针。可以使用回调函数对上述计算机的代码进行简化。回调函数就是一个通过函数指针调用的函数。
2023-11-17 16:28:59
40
原创 C语言学习第十三天(指针部分三)
根据数组名就是数组首元素的地址这个规则,二维数组的数组名表示的就是第一行的地址,是一维数组的地址,第一行的一维数组的类型就是int[5],所以第一行的地址的类型就是数组指针类型 int(*)[5]。signal函数的参数有两个,第一个是int类型,第二个是函数指针类型,该指针指向的函数参数是int,返回类型是void,signal函数的返回类型是这种类型的void(*)(int)函数指针,该指针指向的函数参数是int,返回类型是void。所以p是一个指针,指向的是一个数组,叫数组指针。
2023-11-14 09:14:23
78
1
原创 C语言学习第十二天(指针部分二)
把这三个的结果打印出来,发现结果一模一样,这里我们发现&arr[0]和&arr+1相差4个字节,arr和arr+1相差4个字节,是因为&arr[0]和arr都是首元素的地址,+1就是跳过一个元素。同理arr[i]应该等价于*(arr+i),数组元素的访问在编译器处理的时候,也是转化成首元素的地址+偏移量求出元素的地址,然后解引用来访问的。&数组名,这里的数组名表示整个数组,去出的是整个数组的地址(整个数组的地址和数组首元素的地址是有区别的)除此之外,任何地方使用数组名,数组名都表示首元素的地址。
2023-11-13 23:50:49
48
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人