自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 threadcache实现细节(二)

在之前有说过高并发内存池中每个线程都有自己独享的thread cache,而thread cache在之前的文章中也说到过是哈希桶结构,现在的问题是我们如何让每个线程都独享自己的thread cache呢在多线程中,在一个进程里可能有多个线程,多个线程共享进程地址的空间,每个线程有自己独立的空间 栈等等,每个线程也共享全局段 代码段等等比如下图中有三个thread cache,我们怎么确定他对应的线程能够独享呢,或者说谁是谁的thread cache,什么时候创建thread cache呢,如果是哪个线程

2024-12-08 17:04:59 769 2

原创 threadcache实现细节(一)

如图因为映射对应的对象是一个范围的比如size=7,因为7

2024-11-30 15:51:50 660

原创 threadcache整体设计

这是之前定长内存池的结构,这里的缺点就是定长,因为每次切割的内存大小是固定的,所以内存浪费的比较多thread cache的结构就在这个的基础上进行了升级thread cache是一个哈系桶结构,并且不是定长内存,而是切割成大大小小的内存,然后将对应的内存挂在指定的位置,这样就可以减少内存碎片的问题内存碎片化分为内碎片和外碎片上面的情况就是内碎片,比如我申请的空间是8个字节,但是实际上我只用了6个字节,多出来的空间就是碎片,这种碎片就叫内碎片内碎片就是申请的空间有小部分用不上上面的图在之前有用

2024-11-23 10:00:36 796 1

原创 设计定长的内存池

申请一大块内存,用一个指针指向申请的内存,这里的难点是内存释放,因为我们申请的是一块很大的内存,而使用的时候都是将这一大块内存切成一小块一小块的用,而用完后释放我们不可以直接将他还给系统,因为释放的内存太小了,如果还给系统就会出现内存碎片的问题,所以我们是要将需要释放的内存管理起来,当他们都释放后再归还内存,这里的管理方式就是用一个链表将内存管理起来由于是定长内存池,这里的定长就是切固定大小的内存首先我们需要一个类由于是定长内存池,所以类里面一点要有一个指针指向申请的内存空间,为了方便切割内存我们使用

2024-11-13 11:05:34 830 25

原创 内存池的含义

池化技术就是程序先向系统申请过量的资源,然后自己管理,以备不时之需。之所以要申请过量的资源,是因为每次申请该资源都有较大的开销,不如提前申请好了,这样使用时就会变得非常快捷,大大提高程序运行效率举个例子,大学生的生活费基本上都是一个月一个月的给,因为这样给效率会更高一些,假如不是这样一次性给很多钱,那么就会出现大学生经常找父母要钱,比如今天我想吃顿饭,结果发现没钱了,于是找父母要钱,而他们给的钱也就刚好够这顿饭的钱,等到了下次要吃饭的时候发现又没钱了,于是又找他们要钱。

2024-11-09 10:23:01 967

原创 笔试练习day7

OR59 字符串中找出连续最长的数字串这道题是找出最长连续的数字,并将这串数字以字符串的形式输出,解题的思路就是用两个指针(i和j)遍历这个字符串当i指针第一次遇到数字字符时就将位置给到j指针此时j往后开始去查找这个连续的数字字符串有多长,当j遇到不是数字字符的时候就表示这个连续的数字字符串已经找完了,要计算他的长度.这个长度的计算我们可以直接用两个变量去记录这个数字字符串的起始位置和长度然后i变到j的下一个位置继续重复上面操作当遇到字符串长度比之前的len要大的时候就更新begin和len

2024-10-16 17:08:55 1265 23

原创 笔试练习day6

链接大数加法这道题就是模拟计算的过程比如123+789,我们先让各位的相加,因为涉及到进位,所以需要有一个中间变量t保存进位的数比如3+9=12.需要进1,就用中间变量t=1计算十位的时候2+8+t=11,再让t=1…因为是以字符串形式去返回的,所以我们需要定义一个string ret并且计算的过程中需要知道字符串有多少个字符,所以我们用sizes和sizet分别表示字符串s和字符串t有多少个字符因为从个位开始计算,然后一直进位,所以我们要进行while循环,循环条件即是sizes和size

2024-09-28 11:55:30 1059 1

原创 Linux权限

权限的限定不是针对人,而是针对某种角色,比如我是某某学校的学生,所以我可以自由的出入学校,但是这个权利不是因为我这个人,而是我这个角色,是这个学校的学生,所以我有了这个权限,因此权限=人(角色)+事物属性。另外有一种特别的情况就是当一个用户即是拥有者又在所属组里,就会发生拥有者的所有权限都被限制了,而所属组的权限没有限制,这个时候这个用户的权限是拥有者权限还是所属组的权限呢?在生活中权限无处不在,比如当我们在看电视剧时的VIP用户可以看提前看视频等等,以及一些游戏的VIP用户,可以获得一些特殊的权利等等。

2024-09-15 21:55:45 1235 16

原创 Linux基础指令(三)详解

面对大文件时我们很难查找到最开始的数据,比如我们想要看第一行,我们可能会慢慢的往上滑动去找,但是有了more命令后我们输入more log.txt就可以一行一行的去查找,如果想要直接跳到某一行, 比如跳到100行,我们就输入/100,这里的100是关键字,当查找完后我们可以按Q+回车退出。当我们多次运行之后发现log.txt的内容没有变化,这是因为我们用的是"w",他的意思是只写,但是没有追加写的意思,如果要追加写的话应该用"a"

2024-09-10 12:04:49 771 19

原创 Linux基础指令(二)详解

我们现在处于根目录,现在进入bin这个文件中进入后用ls展示所有的文件名我们会发现有许多看不懂的文件,但当我们仔细的去找的时候发现里面的一些文件名就是之前指令的名字我们可以通过ls -l去搜索出来所以这里想要说的就是指令其实就程序在我们平时用的一些软件中,其实就是通过代码编写出来最后生成可执行的应用程序,我们可以在文件中找到应用程序应用程序是以.exe结尾的,我们平时写的代码在运行时也会生成生成.exe结尾的文件因此指令 程序 可执行程序其实都是一回事,指令就是程序,因此安装其实就是在

2024-09-04 22:49:32 998 40

原创 Linux基础指令(一)详解

首先我是在阿里云上购买的云服务器当购买后点击控制台来到这个界面后点击左上角的三个杠点击云服务器在云服务器中我们可以查看到公网IP(在用其他软件远程连接的时候会用到)并且我们也可以直接在当前界面上远程连接云服务器 当然我们也可以通过下载阿里云的软件远程连接云服务器下载后点击红色方框中的这个东西来到这个界面后要输入公网IP(公网IP查看方式在上面有提到)我们可以只修改公网IP,其他的可以不动修改完后我们需要输入登录的用户名,在刚开始的时候我们所用的都是root账号,所以只需要输入r

2024-08-27 13:46:28 996 31

原创 笔试练习day5

链接JZ62 孩子们的游戏(圆圈中最后剩下的数)这个有点类似于约瑟夫问题。

2024-08-20 13:42:21 1152 34

原创 笔试练习day4

链接WY22 Fibonacci数列这道题不是让我们求斐波那契数,而是让我们将一个数通过加或减的方式去让他变成一个斐波那契数,每次变化的绝对值为1,要求我们得到最小变化的次数我们以示例1为例子N=15时只需要求出他距离那个斐波那契数最近就可以了,比如15-13=2 21-15=6,显然15距离13最近,因此输出2当N=13的时候,距离应该是0,因为N就是斐波那契数所以我们得出了一个结论就是首先我们需要判断N是否是斐波那契数,如果是就返回0,如果不是那就说明N是在两个斐波那契数中间夹着的,我们只需要求

2024-08-12 08:00:00 1193 35

原创 笔试练习day3

链接添加链接描述这道题就是提取一句话中每个单词的首字母,并且将他们的首字母用大写的形式输出,这里的难点就在于每个单词是通过空格分隔开的,在输入的时候如果用scanf和cin直接输入的话会因为有空格而丢失后面的数据解决这个难点的第一个方法是用getline输入,getline输入是遇到’\n’才停止,也就是遇到回车键才结束,这样就不会因为有空格而丢失数据了,后面过程就是通过循环去找空格出现的位置,然后空格的下一个位置就是单词的首字母第二个方法就是用string去解决(这个解法就是通过循环直接往strin

2024-08-08 08:00:00 794 30

原创 笔试练习day2

链接BC64 牛牛的快递这道题和出租车那种是一个意思,首先要有一个起步价格,之后多出来的要额外收费,这样看起来就是一个一次函数的方程,y=kx+b+a,k=1是每千克收的钱,x是快递的重量(这里要注意x有小数的话要往整数进1),b=20表示的是起步价,而a就是是否加急的费用,不加急a=0,加急a=5我们需要先模拟一下这个过程,假设有akg,对于a来说有两种情况,一种是<=1,另一种是>1对于<=1这种情况比较简单,>1这种情况是要考虑a-1是否有小数,如果有小数就需要向上取整,比如1.1向上取整就是2

2024-08-04 08:49:34 1367 29

原创 笔试练习day1

链接BC153 [NOIP2010]数字统计这道题是统计2出现的次数,比如在[2,22]中,出现2的有,2,12,20,21,22,其中22中2出现了2次,所以要统计一个数中是否有多个2出现另外我们还需要分析题目给出的范围因为根据题目的信息我们可以得出是整形类型,int的数据范围是10^9,当题目给的数据范围超过这个的时候,我们要用longlong类型数字拆分这个方法比较常用,就是重复模10之后再除10拿22举例第一步:22%10我们就可以得到他个位的数字也就是2第二步:个位的数字拿到后,我们就

2024-07-30 08:52:43 916 23

原创 模拟string(四)详解

现代写法相对于传统写法在二插树 链表等场景优势比较明显因为树的节点如果用传统写法需要一个节点一个节点的开空间,然后再释放,而现代写法就是直接调用拷贝构造函数,然后就交换,并且省了自己去释放空间。

2024-07-27 11:28:59 1183 13

原创 模拟string(三)详解

因为返回的值是不允许被修改的,所以在后面加了个constsize_t capacity()const获取capacity代码char& operator[](size_t pos)获取pos位置字符这里有两个函数,因为有时候会遇到常量字符串,就是只能读取数据,但是不能修改,所以需要分两个函数来对待不同的情况const char& operator[](size_t pos) const获取pos位置字符(只能读取不能更改)代码我们加上断言可以防止访问越界,并且因为pos位置的空间是通过ne

2024-07-24 09:10:41 991 28

原创 模拟string(二)详解

void reserve(size_t n)我们需要先判断如果传入的n值是大于或等于_capacity时,就代表需要扩容,这里的扩容我们用new来扩容new扩容的方式就先用一个char*的tmp类型指针,然后new开辟一块空间,空间大小为n个字节因为new开辟的空间是没有数据的,所以我们需要将_str的数据拷贝过来,所以strcpy,然后拷贝之后释放掉原来的空间让_str指向tmp所指向的空间,之后更改_capacity的值void insert(size_t pos, char ch)字符前插错误写法

2024-07-21 10:22:26 731 21

原创 模拟string(一)详解

这里的错误是_str(nullptr),因为C++要对C语言进行兼容而有一个函数是下面这样的,返回指针如果返回的是空指针,然后我们将他打印,就会出现问题而我们用库里面的就不会出现问题指针初始化的时候不可以像下面这样因为在初始化的时候传入的指针可能会是下面这样的情况将常量字符串传入,导致在初始化后我们不能将str修改,并且不可以扩容所以正确写法是自己开空间拷贝数据这个顺序是不可以的,因为初始化列表的初始化顺序不是按实例化的顺序,而是按照声明的顺序初始化,这样就会导致_str在初始化的时候s

2024-07-18 07:00:00 877 16

原创 认识string(三)详解

这个函数在之前数据结构的文章中有模拟实现出来过,就是尾差,只不过这里的push_back是尾差字符append就是在当前string中的字符串里,追加一个字符串append有六个函数,和之前文章认识string(一)详解中的Construct string非常相似,所以就不介绍了这是他的一些例子operator+=其实就是结合了上面两个的功能assign的功能就是覆盖掉当前的字符串insert就是前插的意思,因为实现的函数比较多,所以就不演示了这是他的一些例子erase功能就是删除字符

2024-07-16 07:00:00 1016 14

原创 认识string(二)详解

这两个其实是一样的,我们通常使用的是sizesize的英文解释:The number of bytes in the string.size_t is an unsigned integral type (the same as member type string::size_type).翻译:字符串size_t中的字节数是无符号整数类型(与成员类型string::size_type相同)。lenth的英文解释:The number of bytes in the string.size_t is an

2024-07-12 23:07:11 937 26

原创 认识string(一)详解

string文档(这个文档广告有点多)建议在看这个文档的时候用旧版本去看,因为旧版本支持搜索,想要进去旧版本就点击红色方框这个位置如果英语不好的可以点击翻译当前页面,但是有时候翻译会有一点问题,比如我们搜索printf函数,然后翻译当前页面后,就会出现下面这种情况,参数的说明符被翻译了而没有被翻译时是这样的所以最好是用英语去看C++的STL的容器是在reference的containers中string则是在reference的miscellaneous headers,如果sting实

2024-07-11 12:36:59 916 23

原创 模板初阶详解

class 类模板名// 类内成员定义。

2024-07-10 08:00:00 1050 22

原创 C/C++内存管理

下面是C语言对自定义类型的一些写法int val;下面是C++的写法int _val;new开空间是会调用malloc,但是直接去调malloc开辟失败了会返回空,所以用operator new去封装malloc下面是调用的一些过程。

2024-07-08 08:00:00 1319 21

原创 类和对象深入理解

声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量用static修饰的成员函数,称之为静态成员函数。静态成员变量一定要在类外进行初始化面试题:实现一个类,计算程序中创建出了多少个类对象。这里的n就是一个静态全局变量,注意静态变量是不能给缺省值的,因为他不是单独属于某一个对象,而是属于这个类的所有对象,因此需要在类外面定义由于n受域作用限定符的限制,当我们屏蔽掉private后就可以访问n了我们再来看看下面的三段代码上面的三个代码中ptr输出的n的值是

2024-07-06 08:53:28 976 20

原创 构造函数深入理解

int _month;int _day=2;int& _ref;A _aa;return 0;现在有一个自定义类型A,将A_aa的声明放在Date的成员声明里,但是A_aa没有在Date的初始化列表当中定义,那A_aa会不会被定义呢?我们需要理解下面这句话。

2024-07-04 10:37:20 1054 27

原创 日期类的实现

通过上面的代码我们可以看出函数是可以互用的,并且代码中灵活的利用this指针与引用d进行比较,得出最后的是否为真。

2024-06-03 12:51:57 888 41

原创 运算符重载(下)

前置++是先++再使用后置++是先使用再++用operator实现前置和后置++感觉非常难因为operator++只能实现这两个的其中一个功能,为了解决这个问题就需要让operator可以特殊处理为了让operator++可以进行区分,可以让其中的一个operator++强行增加一个int参数构成重载来区分注意这里的int是被规定的所以Date& Date::operator++()表示前置++,Date Date::operator++(int )表示后置++,编译器会自动识别因为前置++要求的

2024-05-30 08:00:00 848 32

原创 运算符重载(上)

C++为了增强代码的可读性引入了运算符重载运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。函数名字为:关键字operator后面接需要重载的运算符符号。函数原型:返回值类型 operator操作符(参数列表)注意:不能通过连接其他符号来创建新的操作符(可以连接C/C++语法中存在的操作符):比如operator@重载操作符必须有一个类类型参数,不能去重载运算符改变内置类型的行为用于内置类型的运算符,其含义不能改变,例如:内置的

2024-05-25 09:14:12 1045 36

原创 拷贝函数详解

拷贝构造我们经常在使用,需要拷贝时我们Ctrl C ,构造时就Ctrl V拷贝构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用。拷贝构造函数也是特殊的成员函数,其特征如下:拷贝构造函数是构造函数的一个重载形式。拷贝构造函数的参数只有一个且必须是类类型对象的引用,使用传值方式编译器直接报错,因为会引发无穷递归调用。若未显式定义,编译器会生成默认的拷贝构造函数。 默认的拷贝构造函数对象按内置类型成员内存存储按字节序完成拷贝,这

2024-05-20 09:05:25 902 35

原创 析构函数详解

通过上一篇文章我们知道一个对象是怎么来的,那一个对象又是怎么没呢的?析构函数:与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成对象中资源的清理工作(有点像数据结构中的Destroy函数,作用就是清理链表 树 或堆上的空间清理,如果不清理会出现内存泄漏的情况)注意对象空间的开辟和销毁不需要我们去解决,这些都是由系统去完成的(全局 对象 静态都是系统自己去解决),而像堆上的空间就需要我们去完成了,比如malloc开辟空间的时候需要我

2024-05-16 09:00:00 1150 33

原创 构造函数详解

函数名与类名相同。无返回值(不是像void,是根本不需要写返回类型)对象实例化时编译器自动调用对应的构造函数。构造函数可以重载。如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成编译器生产的默认构造函数有时并没有初始化这是因为C++将数据类型分为内置类型和自定义类型内置类型的含义就是语言自身定义的类型,比如int/char/double/指针…自定义类型就是自己定义的一些类型,比如struct/class。

2024-05-13 07:53:56 1087 26

原创 this指针详解

我们先来看看下面的代码结果如下对应 d1.Print()和 d2.Print()在上一篇文章中就已经讲过他们都是访问的同一个函数,因为print是在一块公共区域里并且print中的_year _month _day并不是类声明的成员变量,因为上一篇文章提到过,成员变量_year _month _day只是声明,并没有占用空间,因此如果把这些没有占用空间的成员变量打印出来是做不到的所以print函数打印的是定义出来的成员变量,也就是初始化后的成员变量而Init 与 Print 两个成员函数,函数体中没

2024-05-11 08:47:27 940 20

原创 C++类的概念以及用法

/ 类体:由成员函数和成员变量组成 };// 一定要注意后面的分号class为定义类的关键字,ClassName为类的名字,{}中为类的主体(注意类定义结束时后面分号不能省略)类体中内容称为类的成员:类中的变量称为类的属性或成员变量(一般情况下类的成员变量都是私有的,因为不希望有人直接去修改成员变量,一般都是通过成员函数去修改,但是这个不是强制要求的)类中的函数称为类的方法或者成员函数。注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理private:int* a;

2024-05-09 09:00:00 680 25

原创 C++入门基础(四)

当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。

2024-05-07 09:00:00 1921 26

原创 C++入门基础(三)

比如:同学A有一个别名为张三,张三是同学A,张三和同学A指的都是同一个人,在C++中同学A可能是int类型,也可能是char类型,甚至可能是int*类型或int**类型…

2024-05-03 10:33:22 836 22

原创 C++入门基础(二)

/.h文件// .cpp文件代码运行后会报错,重复默认参数,因为a和b在.h文件和.cpp文件中的缺省参数值不同起了冲突如果.h文件和.cpp文件缺省参数值都相同时//.h文件// .cpp文件那如果.h文件中我们不用缺省参数,而.cpp用缺省参数会怎么样.h文件.cpp文件这次只让.h文件用缺省参数.h文件.cpp文件。

2024-05-01 08:35:58 983 21

原创 C++入门基础(一)

定义命名空间,需要使用到namespace(名字空间)关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。

2024-04-27 09:00:49 759 31

原创 栈和队列详解

如果遇到函数参数需要传入多个二级指针,那么我们可以用结构体将他们封装起来,结构体封装的成员就是二级指针的值,然后通过结构体访问成员将他们修改,并且在传参时我们只需要传入结构体的地址即可。

2024-04-24 20:36:14 711 25

空空如也

空空如也

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

TA关注的人

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