八股
文章平均质量分 78
风中的默默
1998年过去了,我们很怀念它
展开
-
内存泄漏检测
代码量比较少的情况,可以自己写malloc和free函数,然后用宏定义来替换,自己的malloc和free函数里就分别记录每次分配和释放内存时内存大小和位置记录。模仿shared_ptr维护一个引用数,在程序结束时如果引用计数表不为空,则打印出存在内存泄漏的相关信息。如果有内存泄漏的话,它就会提示堆溢出问题什么的,会定位到文件里的具体行数。,显示有内存泄漏错误,定位到具体行数。生成test可执行文件后直接。安装valgrind后,使用。原创 2024-04-02 23:55:08 · 176 阅读 · 0 评论 -
HTTPS、对称/非对称加密、SSL/TLS
HTTPS并不是一个单独的协议,是在 TCP 和 HTTP 之间加入了 SSL/TLS 安全协议,使得报文能够加密传输,SSL是TLS的前身,现在使用的大多都是TLS。原创 2024-04-02 22:20:10 · 2986 阅读 · 0 评论 -
Lambda表达式
Lambda默认一个const函数,mutable可以取消其常量性,在使用mutable时,参数列表不可省略(即使参数为空)。lambda的实现就像是范围for底层实际是迭代器一样,它的底层就是仿函数,也就是重载operator()运算符。一个lambda有两个部分必须持有,捕捉列表、函数体。Lambda作用:定义匿名函数对象的便捷方法。原创 2024-04-01 23:34:49 · 127 阅读 · 0 评论 -
TopK问题解决方案
在BFPTR算法中,仅仅是改变了快速排序Partion中的pivot值的选取,在快速排序中,我们始终选择第一个元素或者最后一个元素作为pivot。而在BFPTR算法中,每次选择五分中位数的中位数作为pivot,这样做的目的就是使得划分比较合理,从而避免了最坏情况的发生。:维护K个元素的最大堆,每次和堆顶元素比较,然后堆化,时间复杂度为O(nlogK),时间复杂度比方案1好,毕竟K一般是远远小于n的。(2)将比这个数大的数全部放到它的右边,把小于或者等于它的数全部放到它的左边。一趟快速排序的过程如下。原创 2024-04-01 23:00:37 · 2563 阅读 · 0 评论 -
【redis设计原理】
Redis 是一种基于内存的数据库,它对数据的读写操作都是在内存中完成,所以它的读写速度非常快,常用于缓存,消息队列这些场景。Redis 提供了多种数据类型来支持不同的业务场景,比如 String(字符串)、Hash(哈希)、 List (列表)、Set(集合)、Zset(有序集合)、Bitmaps(位图)等等,并且对数据类型的操作都是原子性的,因为执行命令由单线程负责的,不存在并发竞争的问题。除此之外,Redis 还支持事务 、持久化、过期删除机制等等。原创 2023-08-20 11:35:09 · 4774 阅读 · 0 评论 -
【MySQL】阅读笔记
我们常说的索引数据结构,就是由存储引擎层实现的,不同的存储引擎支持的索引类型也不相同,比如 InnoDB 支持索引类型是 B+树 ,且是默认使用,也就是说在数据表中创建的主键索引和二级索引默认使用的是 B+ 树索引。之所以要逆序,是因为记录头信息中指向下一个记录的指针,指向的是下一条记录的「记录头信息」和「真实数据」之间的位置,这样的好处是向左读就是记录头信息,向右读就是真实数据,比较方便。但其实对于更新比较频繁的表,查询缓存的命中率很低的,因为只要一个表有更新操作,那么这个表的查询缓存就会被清空。原创 2023-08-08 14:56:49 · 2450 阅读 · 0 评论 -
【计算机网络】笔记
它的主要功能是在数据链路层提供的数据帧传送功能上,控制数据链路层和传输层之间的信息转发,然后建立、维护网络的连接,把数据从源端经过若干个中间节点安全传送到目的端,从而向传输层提供最基本的端到端的数据传输服务。传输层主要起承上启下的作用,它向用户提供可靠的端到端的差错和流量控制,保证报文的正确传输,同时向高层屏蔽下层数据通信的细节,即向用户透明地传送报文。表示层是OSI模型的第六层,它的主要功能是充当应用程序和网络之间的翻译角色,它要处理用户信息的表示问题,如数据的编码、数据格式转换、加密解密等问题。原创 2023-07-22 11:20:43 · 5008 阅读 · 0 评论 -
【操作系统】读书笔记
线程又叫轻量级进程,它从属于进程,是程序的实际执行者,一个进程可以包含多个线程,它是CPU调度的最小单位。首先我们都知道,现代的计算机软件都是基于操作系统来运行的,操作系统封装了计算机底层的硬件资源,比如磁盘、键盘、显示器等等,那当我们的应用程序想要访问使用这些计算机资源的时候,就需要调用操作系统提供的服务。如果有的员工在上班时临时空闲,比如等待机器启动什么的,现在没有事情,那么可以让这名工人利用这个时间去做其它的事情,也如果一个线程等待某些条件,可以充分利用这个时间去做其它事情,那这就是协程。原创 2023-07-03 14:59:42 · 4868 阅读 · 0 评论 -
【C++】(三)STL
STL(Standard Template Library),即标准模板库。它是94年被正式纳入C++标准,是 C++ 标准库的重要组成部分。它不仅仅是一个可复用的组件库,而且是一个包含了许多常用的数据结构和算法的软件框架。STL的第一个比较重要的特点是数据结构和算法的分离。STL构成STL提供了六大组件,彼此之间可以组合套用,这六大组件分别是:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器。首先vector的扩容原理是申请新空间,拷贝元素,释放旧空间。原创 2023-07-02 17:27:26 · 4878 阅读 · 0 评论 -
【C++】(二)函数、类、模板
继承是面向对象最显著的一个特性。继承是从已有的类中派生出新的类, 新的类能吸收已有类的数据属性和行为,并能扩展新的能力。继承缺点:耦合度高,因为继承了父类的东西,所以想分开就很难了,藕断必定丝连。增减的代码维护难度,尤其是多重继承和兄弟关系继承,毕竟家族历史长派生类中包含并且可以使用它从基类继承而来的成员,为了使用这些成员,派生类必须知道他们是什么。所以必须定义而非声明。模板是c++的一种特性,它可以让类或者函数在对应不同的类型的时候正常工作,而不用为每一种类型分别写一份代码。原创 2023-07-02 17:26:04 · 4885 阅读 · 0 评论 -
【C++】(五)11新特性
所以在刚才的例子里,我们可以用weak_ptr声明链表节点的pre和next两个指针,那么节点在指向前一个或后一个节点后并且不会改变shared_ptr的引用计数,当node1计数为0时,node1指向的空间就会被销毁掉。auto是C++11新增的一个关键字,auto也叫类型说明符,它可以让编译器替我们去分析表达式所属的类型,它仅仅是一个占位符,在编译期间它会进行类型推导,然后被真正的类型所替代。我们需要一个指针对象,需要一个引用计数的指针设定对象的值,并将引用计数计为1,需要一个构造函数。原创 2023-07-02 17:42:37 · 287 阅读 · 0 评论 -
【C++】(四)内存状态
实际上每个元素在放的时候都是有一个偏移量的,第一个元素的偏移量是0,其他元素的偏移量是对齐数的整数倍(那么所谓这个对齐数,指的是当前元素大小和当前编译器默认对齐数,它们两个之间的最小值),偏移了之后就开始放元素,当元素都放完之后,还需要看一下当前总的存储单元是不是这些元素中最大对齐数的整数倍,如果不是的话需要补成整数倍,也就是后面会空几个位置。我们都知道在内存中放数据之后CPU会来读取,但是CPU从内存中读取数据的时候并不是一个字节一个字节来读,而是以块儿的形式来读的,这个块儿的大小是内存的读取粒度。原创 2023-07-02 17:34:42 · 2453 阅读 · 0 评论 -
【C++】(一)基础语法
实际上每个元素在放的时候都是有一个偏移量的,第一个元素的偏移量是0,其他元素的偏移量是对齐数的整数倍(所谓对齐数是当前这个元素大小和当前编译器默认对齐数,它们两个之间的最小值),而且存放元素完成之后,还需要看一下当前总的存储单元是不是这些元素中最大对齐数的整数倍,如果不是的话需要补成整数倍,也就是后面会空几个位置。我们都知道在内存中放数据之后CPU会来读取,但是CPU从内存中读取数据的时候并不是一个字节一个字节来读,而是一块一块来读的,这个块的大小叫做内存的读取粒度。那这就是结构体的内存对齐。原创 2023-06-01 17:10:19 · 2788 阅读 · 0 评论