首页 > 其他分享 >STL两级空间适配器

STL两级空间适配器

时间:2024-05-30 18:00:28浏览次数:14  
标签:字节 STL 两级 适配器 链表 内存 空间 节点

为什么需要两级空间适配器? 因为我们如果频繁的再堆上面申请内存释放内存,就会在堆上面造成很多的外部碎片,造成空间浪费,每次都要调用malloc、free函数,降低空间利用率。
一级空间适配器: 当申请内存>128bytes的时候就用一级空间适配器。(malloc、free、realloc等方法)
二级空间适配器:当申请的内存 <=128bytes的时候就用二级空间适配器。默认STL使用二级。

二级空间适配器的工作原理:
1、维护16条链表,分别是0-15号链表,最小8字节,以8字节逐渐递增,最大128字节,你传入一个字节参数,表示你需要多大的内存,会自动帮你校对到第几号链表(如需要13bytes空间,我们会给它分配16bytes大小),在找到第n个链表后查看链表是否为空,如果不为空直接从对应的free lit中拔出,将已经拨出的指针向后移动一位。
2、对应的fe lst为空,先看其内存池是不是空时,如果内存池不为空:
(1)先检验它剩余空间是否够20个节点大小(即所需内存大小提升后)20),若足够则直接从内存池中拿出20个节点大小空间,将其中一个分配给用户使用,另外19个当作自由链表中的区块挂在相应的fre .lst下,这样下次再有相同大小的内存需求时,可直接拨出。
(2))如果不够20个节点大小,则看它是否能满足/1个节点大小,如果够的话则直接拿出一个分配给用户,然后从剩余的空间中分配尽可能多的节点挂在相应的ire ist中。
(3)如果连一个节点内存都不能满足的话,则将内存池中剩余的空间挂在相应的fe. lit中(找到相应的fre.lit),然后再给内存池申请内存,转到3。
3、内存池为空,申请内存此时二级空间配置器会使用malc)从heap上申请内存,(一次所申请的内存大小为2
所需节点内存大小(提升后)'20+一段额外空间),申请A0块,一半拿来用,一半放内存池中。4、mallc没有成功在第三种情况下,如果malloc失败了,说明heap上没有足够空间分配给我们了,这时,二级空间配置器会从比所需节点空间大的fre lst中一一搜索,从比它所需节点空间大的fre list中拔除一个节点来使用。如果这也没找到,说明比其大的fre lit中都没有自由区块了,那就要调用一级适配器了。

释放时调用deallocate()函数,若释放的n>128,则调用一级空间配置器,否则就直接将内存块挂上自由链表的合适位置。

STL二级空间配置器虽然解决了外部碎片与提高了效率,但它同时增加了一些缺点:
1.因为自由链表的管理问题,它会把我们需求的内存块自动提升为8的倍数,这时若你需要1个字节,它会给你8个字节,即浪费了7个字节,所以它又引入了内部碎片的问题,若相似情况出现很多次,就会造成很多内部碎片;
2.二级空间配置器是在堆上申清大块的狭义内存池,然后用自由链表管理,供现在使用,在程序执行过程中,它将申请的内存一块一块都挂在自由链表上,即不会还给操作系统,并且它的实现中所有成员全是静态的,所以它申请的所有内存只有在进程结束才会释放内存,还给操作系统,由此带来的问题有∶
1.即我不断的开辟小块内存,最后整个堆上的空间都被挂在自由链表上,若我想开辟大块内存就会失败;
2若自由链表上挂很多内存块没有被使用,当前进程又占着内存不释放,这时别的进程在堆上申请不到空间,也不可以使用当前进程的空闲内存,由此就会引发多种问题。

标签:字节,STL,两级,适配器,链表,内存,空间,节点
From: https://www.cnblogs.com/chhblogs/p/18222974

相关文章

  • 23种设计模式之适配器模式
    适配器模式1、定义适配器模式:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。2、适配器模式结构Target(目标抽象类):定义客户所需要的接口,可以是一个抽象类或接口,也可以是具体类。在类适配器中,由于Ja......
  • RC-u2-2023【STL-string】
    Raicom-2023省赛题目~题意:A:最近出了一个饮料营养等级你们知道吗?例如无糖的饮料是A级,可乐是D级……B:那……无糖可乐是什么级别?C:AD级吧。A:出院!B:出什么院,你也给我进去!以上是某群中一段有趣的对话。请你按照里面的逻辑,在已知某些饮料的等级的情况下,给饮料定级。定级的......
  • 【C++/STL】vector(常见接口、模拟实现、迭代器失效)
     ......
  • 设计模式:适配器模式(Adapter)
    设计模式:适配器模式(Adapter)设计模式:适配器模式(Adapter)模式动机模式定义模式结构时序图模式实现在单线程环境下的测试在多线程环境下的测试模式分析优缺点适用场景应用场景应用实例适配器模式和代理模式的区别模式扩展默认适配器模式(DefaultAdapterPattern)接口适配器模......
  • 【知识点】深入浅出STL标准模板库
    前几天谈论了许多关于数论和数据结构的东西,这些内容可能对初学者而言比较晦涩难懂(毕竟是属于初高等算法/数据结构的范畴了)。今天打算来讲一些简单的内容-STL标准模板库。STL标准模板库C++标准模板库(StandardTemplateLibrary,STL),是C++语言非常重要的一个构成部分......
  • C++ STL 函数对象:隐藏的陷阱,如何避免状态带来的麻烦?
    STL函数对象:无状态即无压力一、简介二、函数对象三、避免在函数对象中保存状态3.1、函数对象3.2、lambda表达式四、选择合适的更高层次的结构五、总结一、简介在使用C++标准模板库(STL)时,函数对象(FunctionObject)是一种强大的工具,它可以帮助你编写更具表......
  • AcWing 3466. 清点代码库(STL:map,vector)
    3466.清点代码库需要求有几种不同数列,每种有多少个,可以想到用map。它的键是一个数列,可以把它放在vector里。也就是map<vector<int>,int>要满足要求的输出序列,就要想把它放在其他容器,或数组里,进行排序。因为map不能自定义排序,而且既要对值排序,还要对键排序。我起初是定......
  • C++初阶学习第九弹——探索STL奥秘(四)——vector的深层挖掘和模拟实现
    string(上):C++初阶学习第六弹——探索STL奥秘(一)——标准库中的string类-CSDN博客string(下):C++初阶学习第七弹——探索STL奥秘(二)——string的模拟实现-CSDN博客vector(上):C++初阶学习第八弹——探索STL奥秘(三)——深入刨析vector的使用-CSDN博客前言:在前面我们已经学习了string的......
  • 第17章 STL动态数组类
    1std::vector的特点vector是一个模板类,提供了动态数组的通用功能:在数组尾部插入元素时间是固定的在数组中间添加或删除元素所需时间与改元素后面的元素个数成正比存储的元素数是动态的,vector类负责管理内存vector是一种动态数组,结构体如下:2vector操作2.1实例化vector......
  • STL 以及 C语言与C++的区别
    C++语言的标准库(STL)容器(Containers)vector:动态数组,可以动态增长和收缩,支持快速随机访问元素。list:双向链表,支持在任意位置快速插入和删除元素。map:关联容器,以键值对(key-value)形式存储元素,支持快速查找和插入。竞赛常用C++STL用法https://io.zouht.com/154.htmlv......