- 博客(51)
- 收藏
- 关注
原创 C++项目实战——高性能内存池
我们模拟实现了一个高性能的内存池,当我们需要申请空间时可以直接从内存池中拿取,还可以实现多个进程的并行,效率得到了极大的提升。之前已经实现了申请空间的这个过程,当空间被用完以后就应该被放回内存池中,以便后续需要时继续使用,因此我们现在来实现一下释放的整个过程。
2025-08-25 14:58:33
872
原创 C++项目实战——高性能内存池(四)
之前的文章中介绍了threadcache和centralcache,那么接下来该详细介绍pagecache,并实现从pagecache中申请空间。
2025-08-23 20:57:16
1057
原创 C++项目实战——高性能内存池(三)
在之前的文章中我们已经做完了thread cache的申请和释放部分,而当thread cache无法申请空间时,就需要去central cache进行申请,接下来让我们继续去了解一下central cache,并进行模拟实现。
2025-08-23 11:54:39
802
原创 C++项目实战——高性能内存池(二)
通过上篇的介绍以及开胃菜的练习,咱们对内存池已经有了一些基本的了解,那么现在开始就要开始学习高并发内存池的整体框架以及模拟实现。
2025-08-22 19:09:36
663
原创 C++项目实战——高性能内存池(一)
当前项目是实现一个高并发内存池,其原型是Google的一个开源项目tcmalloc,tcmalloc全称是Thread-Caching Malloc,即线程缓存的malloc,实现了高效的多线程内存管理,用于替代系统的内存分配相关函数。我们接下来的做法就是将tcmalloc最核心的框架简化后拿出来进行模拟实现出一个自己的高并发内存池,通过这种方式来学习tcmalloc的精华。
2025-08-21 21:01:15
958
原创 特殊类设计
根据我们刚才分析的内容,只允许在堆上创建对象,那么类的对象只能通过new关键字来创建,因此我们不仅要禁止栈创建对象,还要提供堆上创建的接口,所以要将类的构造函数声明为私有,并禁止默认构造函数和赋值重载函数的生成,这样做是为了禁止外部在栈上直接创建对象,同时,通过静态的方法提供一个接口来创建对象,并确保对象只能通过这个接口在堆上创建。为了解决饿汉模式下的一些缺点,懒汉模式避免了在main函数之前创建对象,使用一个指针来进行标识,首先将指针置空,当需要第一次使用对象时再去创建对象。首先要了解一下堆和栈的区别。
2025-08-14 13:11:10
669
原创 C++智能指针
auto_ptr:管理权转移,会导致被拷贝对象悬空,建议不要使用它unique_ptr:禁止拷贝,简单粗暴。日常使用,不需要拷贝的场景,建议使用它shared_ptr:引用计数支持拷贝,需要拷贝的场景,就使用它。但是要小心构成循环引用,循环引用会导致内存泄露weak_ptr:专门解决shared_ptr的循环引用问题,不能RAII。
2025-08-13 20:03:47
649
原创 C++11
在C++语言发明以后,一部分的爱好者成立了C++标准委员会,以便后续对C++更好地维护,在标准委员会成立的第一年发布了C++98这一版本,并约定每5年进行一次标准更新。在2003年,C++03如期发布,主要修复了之前的一些问题,但在下一个五年计划时,出现了延期的情况,以至于到了2011年时才发布了C++11。与C++03不同的是,C++11并不再是进行一些无关痛痒的修复,而是增加了很多新内容,大大提高了运行效率,因此我们接下来就来学习一下C++11的内容。
2025-08-11 16:56:32
761
原创 位图和布隆过滤器
先来看一道面试题:给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中1、暴力解决,对这40亿个数进行遍历,看是否能找到给定的无符号整数2、排序后再使用二分查找3、用set来解决理论上这三种方法都可以解决这个问题,但是这三种方法都需要对40亿的数据进行存储,每个整数占4个字节,那么40亿个整数就需要160亿个字节,也就是16G左右,这显然难以实现了。
2025-08-07 15:14:52
799
原创 C++ 红黑树
还是像AVL树一样,我们根据红黑树的概念和特点,先来写出红黑树的结点,与AVL树不同的是,红黑树需要增加存储位用于定义每个结点的颜色,那么对于颜色我们可以选择用enum枚举定义,同时给出默认构造函数,但是在默认构造函数中,对于颜色的初始值我给的是Red,这是因为新插入的结点必须是红色的,如果新插入为黑色,那么将会破坏红黑树每条路径上黑色结点数一致的规定,因此选择插入红色节点,当出现有两个连续的红结点时需要再向上进行颜色调整,这在插入结点部分会进行具体分析enum colorRed,Black。
2025-07-30 14:59:31
866
原创 C++ AVL树
首先要写一个结构体对AVL树中的节点进行定义,为什么是结构体而不是类呢,因为后面的代码中我们要一直对定义的节点的内容进行使用,如果写成类的话需要注意使用public,而结构体的内容默认为public,所以在习惯上我使用结构体。由于AVL树依然是一个二叉搜索树,那么二叉搜索树有key型和key-value型,那么我先会实现key-value类型,因为这个更加复杂。在结构体中对节点进行定义,也可以认为是对每个节点所包含的内容进行定义和封装。
2025-07-29 16:27:20
644
原创 C++多态
多态是在不同的继承关系的类对象,去调用同一函数,产生了不同的行为。在继承中要构成多态还有两个条件:1、必须通过基类的指针或者引用调用虚函数 2、被调用的函数必须是虚函数,且子类必须对父类的虚函数进行重写public:cout << "买票——原价" << endl;public:cout << "买票——八折" << endl;Student st;
2025-07-21 17:02:51
966
原创 C++继承
s1.Print();继承有public继承、protected继承、private继承三种方式,访问限定符有public、protected、private三种如果是基类的private成员,那么只有在基类内部可以使用,对于继承此基类的子类来说,基类的成员不可见,语法上限制访问,在子类内外都不能使用。
2025-07-19 22:16:19
914
原创 模板的进阶
模板的优点在于其复用了代码,节省资源能够实现更快的迭代开发,C++的标准模板库(STL)因此而产生,同时也增强了代码的灵活性缺点在于模板会导致代码膨胀问题,也会导致编译的时间变长,并且,在出现模板编译错误时,错误信息非常凌乱,不容易定位错误。
2025-07-19 17:57:45
857
原创 关于list
同时,由于list底层结构的不同,不能像string和vector一样去实现迭代器,因为string和vector在底层结构中是连续的,可以直接用指针去访问得到相应位置的元素内容,对指针进行++或者--操作又可以直接到达下一位置或者前一位置,list中存放的是一个一个不连续的结点,对迭代器的实现时需要进行相应的重载,使用也会受限,比如在上述代码中就无法使用lt.begin()+3等,更多内容在进行list的模拟实现中可以得到更多的体会。3、list的模拟实现。
2025-07-15 15:50:27
454
原创 string模拟实现
当我们已经了解了string类的各种函数及其使用,我们可以用已学的C++知识来模拟实现一下string类,实现一下string类中相关的函数。
2025-07-11 16:08:53
253
原创 string类
find_first_of:可以有一个或者两个参数,如果只有一个字符/字符串参数,则为从头开始查找并返回与该字符串中任一字符匹配的首个位置,如果有两个参数,则为从第二个参数位置开始查找,返回与该字符串中任一字符匹配的首个位置,与之同系列的函数还有find_first_not_of,find_last_of,find_last_of,find_last_not_of,通过函数名可以得知其相应的用法和作用。insert:插入内容,可以在指定位置插入指定数量的字符,也可以在指定位置插入字符串。
2025-07-08 15:13:26
879
原创 模板(初阶)
使用这样的重载函数虽然可行,但是重载的函数仅仅只是类型不同,代码的复用率低,如果有新的类型就需要重新写,同时代码的可维护性也比较低,如果一旦出现错误所有的重载函数可能都会出错。函数模板代表一个函数家族,该函数模板与类型无关,在使用时被参数化,根据参数类型产生函数的特定类型版本,那么以交换函数为例,使用函数模板来实现。对于普通类来说,类名和类型是一样的,对于类模板来说,类名和类型不一样,用上述代码来举例,类名是Stack,类型是Stack<T>用不同类型的参数使用函数模板,称为函数模板的实例化。
2025-07-07 11:45:46
390
原创 C/C++内存管理
对于自定义类型new/delete除了开空间还会调用构造函数和析构函数,但是malloc/free不会class Apublic:A(int a=0):_a(a)~A()private:int _a;delete p2;free(p5);
2025-07-06 18:03:50
770
原创 类和对象(下)
这题不能使用循环,我们可以先定义出一个Sum类,并声明静态成员i和ret,i用于实现从1-n的变化,ret用于计算和,其中为了能够实现n次的加,定义了一个类似于数组,这个数组的类型为自定义类型,自定义类型会自动调用构造函数进行初始化,将数组大小设为n则会调用n次构造函数,也就实现了i从1-n的n次变化,为了i和ret每次都能延续之前的结果并在此基础上进行加法,需要把i和ret都设置为静态。内部类是一个独立的类,它不属于外部类,更不能通过外部类的对象去访问内部类的成员,外部类对内部类没有任何优越的访问权限。
2025-07-06 11:20:19
724
原创 类和对象(中)日期类实现
在之前的两篇类和对象中已经介绍了很多概念性的内容,这篇博客将使用之前所介绍的内容来编写一些代码,实现日期类的内容。首先是头文件,在这里定义了日期类以及函数声明。对这些需要实现的函数进行具体的定义和实现。
2025-07-05 17:53:59
203
原创 C++的回顾与学习之类和对象(中)
对于内置类型成员会完成值拷贝/浅拷贝,对于自定义类型成员会调用他的拷贝构造(浅拷贝也就是根据内存存储按字节序完成拷贝,但是对于某些情况,比如开辟了一些内存空间时,如果还是使用这样的浅拷贝,看似有了两个对象,实际上两个对象会指向同一片内存空间,那么在一个对象进行修改时,另一个也会被迫修改,因此不可以使用这样的浅拷贝)其中赋值运算符重载属于默认成员函数之一,用于已经存在的两个对象之间的复制拷贝,这要区别于拷贝构造函数,拷贝构造函数是用一个已经存在的对象初始化另一个对象(还不存在的)。注意:析构函数不能重载。
2025-07-05 16:54:27
1024
原创 C++的回顾与学习之类和对象(上)
刚才我们将类比作设计图,那么类中的成员变量就相当于是自己家的房屋设计,而成员函数则相当于是小区内篮球场、健身区等公共区域的设计,因此在计算房屋占地面积时不需要计算公共区域的占地面积。和class定义类是一样的,区别是struct定义的类的默认访问权限是public,class定义的类的默认访问权限是private。类中的函数称为类的方法或者成员函数。4,、如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
2025-07-03 16:12:12
701
原创 C++的回顾与学习之C++入门基础
在进行函数调用时会有一些消耗,比如建立函数栈帧这些,C语言中可以通过使用宏函数来解决,但是宏函数比较容易出错,因此C++中采用了内联函数来解决问题,在调用的函数返回值之前加上关键字inline,即成为内联函数,内联函数会在函数调用的地方展开,则没有函数调用了,所以内联函数不需要建立栈帧,不复杂,不容易出错,可读性强,可以调试。缺省参数使用在函数声明或定义时,为函数的参数设定的一个默认值,当调用函数而未传入参数时就会使用缺省参数,当传入了参数时,缺省参数将不会被使用,也就是说缺少参数担任了一个备胎的角色。
2025-07-03 14:51:57
594
原创 自动化测试实战之测试在线文章系统
我们之前已经学过了自动化测试的概念和函数,现在可以选择一个博客系统的项目来进行测试实战一下,以便于更好地掌握所学内容,灵活运用。
2025-04-04 13:56:34
567
原创 自动化测试常用函数
当学习了自动化函数以后,我们就可以使用这些函数编写脚本,来实现自动化测试,以下代码就是示范: 1、元素定位1.1查找元素:find_element(方式,"元素") ----查找一个元素find_elements(方式,"元素") ----查找多个元素例如:使用查找元素函数查找百度页面中的热搜词条若要获取页面多个元素时,可以使用find_elements查找元素的方式:选择器、xpath、ID、class_name.....,常用的主要有cssSelector和xpath选择
2025-04-02 00:06:46
735
原创 关于自动化测试的概念
因此我们需要下载相应的驱动,但通过下载官方驱动的方式可能会引发一系列的问题,比如每次浏览器更新都需要重新下载驱动,如果没有重新下载更新后的浏览器的驱动则会导致自动化运行时候报错。客户端指的是PC端也就是电脑,而移动端指的是手机。软件中的自动化测试也是如此,通过自动化测试有效地减少了人力的消耗的同时也提高了测试的质量和效率(人工测试结果是不可控的,机器测试是可控的)。回答:自动化测试不一定比人工测试更能保障系统的可靠性,自动化测试是测试人员手工编写,后续如果有功能的变更自动化也需要进行不定期的维护和更新。
2025-03-05 20:09:11
691
原创 关于测试分类
白盒测试主要应用于单元测试阶段;先执行静态设计用例的方法,再执行动态设计测试用例的方法;设计用例一般使用路径测试,重点模块追加使用逻辑覆盖方法。
2025-03-05 14:20:58
755
原创 关于测试用例
什么是测试用例?测试用例是为了实施测试而向被测试的系统提出的一组集合,这组集合包含:测试环境、操作步骤、测试数据、预期结果等要素。设计测试用例原则一:测试用例中一个必需部分是对预期输出或结果进行定义。
2025-02-01 23:17:28
1096
原创 关于测试bug
软件测试贯穿于软件的整个生命周期需求分析→测试计划→测试设计、测试开发→测试执行→测试评估→上线→运行维护需求分析:从用户角度:软件需求是否合理;从技术角度:技术上是否可行,是否还有优化空间;测试角度:是否存在业务逻辑错误、冗余、冲突等问题测试计划:制定测试计划:什么时候开发测试,什么时候结束测试,耗时多久测试设计与开发:参考需求文档、技术文档等编写测试用例,写测试文档,明确标注使用到的测试方法,测试工具,测试形式等测试执行:充分利用测试用例和测试工具对项目尽可能做到全方面的测试覆盖。
2025-01-27 19:40:10
348
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅
1