STL内存配置器
一、STL内存配置器的总体设计结构
1.两级内存配置器:SGI-STL中设计了两级的内存配置器,主要用于不同大小的内存分配需求,当需要分配的内存大小大于128bytes时,
使用第一级配置器,否则使用第二级配置器;对于小块的内存的分配使用第二级配置器使用分配与释放内存块的效率更高,时间复杂度为O(1);
2.两级配置器的优点:
(1)使用两级配置器主要是为了避免太多的小块的内存申请导致内存空间中的内存碎片问题;
(2)使用第二级配置器也可以避免太多小块内存分配导致的内存空间浪费问题,因为在申请内存块时内存块的一部分必须记录该被分配的内存块
的大小,在第二级配置器中则不需要记录分配的内存块的大小;
(3)第二级配置器同样也使小块的内存分配与释放效率更快,复杂度为O(1),而普通的首次适配、下次适配、最佳适配算法都无法达到分配与释
放内存块的时间复杂度都为O(1);
二、第一级配置器
1.功能:第一级配置器支持allocate,reallocate,deallocate,set_malloc_handler功能;
2.与C语言内存分配函数的比较:相比C语言中的malloc,realloc,free函数而言,第一级配置器是C语言中内存分配函数的一层包装,其相应的功能分
别调用对应的C语言内存分配函数;
3.第一级配置器的内存分配失败处理功能:第一级配置器增加了处理内存分配失败的机制,set_malloc_handler函数允许用户指定一个函数用于内存
分配失败的处理,当内存分配失败时第一级配置器会调用该函数,如果用户没有指定特定的处理函数,则根据实际情况,根据用户的选择抛出内存分
配失败的异常或者在标准错误流中打印出错信息;
三、第二级配置器
1.第二级配置器的结构:第二级配置器含有一个内存池以及用于管理8的整数倍大小的16个free lists;free lists用来分配小块的内存,内存池用来
填充free lists,使每个free lists含有足够的小块内存用于分配,当free list没有足够的小型的内存块用于分配时,向内存块申请内存填充free list;
2.内存池:内存池实际上是一个使用malloc分配的一个足够大的内存块;
3.free lists:在堆的分配算法中存在首次适配、下次适配、最佳适配算法。同样,堆中内存块的组织方法有隐式空闲链表,显示空闲链表和分离链表法,
free lists即为分离链表法,该方法的优点为分配与释放内存都是O(1)的时间,虽然SGI-STL使用的是普通的分离存储方法,而不是分离适配方法,这会
导致部分空间的浪费,然而由于内存块的浪费在0-8bytes之间,相比较而言,对于经常需要较小的内存块分配的程序而言效率的提高更大;
四、SGI-STL内存分配算法流程图

STL内存配置器的更多相关文章
- SGI STL内存配置器存在内存泄漏吗?
阅读了SGI的源码后对STL很是膜拜,很高质量的源码,从中学到了很多.温故而知新!下文中所有STL如无特殊说明均指SGI版本实现. STL 内存配置器 STL对内存管理最核心部分我觉得是其将C++对象 ...
- 自己动手实现STL 01:内存配置器的实现(stl_alloc.h)
一.前言 在STL中,容器是其中的重中之重,基本的STL中的算法,仿函数等都是围绕着容器实现的功能.而,内存配置器,是容器的实现的基础.所以,我第一次要去编写便是内存配置器的实现.在STL中,内存配置 ...
- stl空间配置器线程安全问题补充
摘要 在上一篇博客<STL空间配置器那点事>简单介绍了空间配置器的基本实现 两级空间配置器处理,一级相关细节问题,同时简单描述了STL各组件之间的关系以及设计到的设计模式等. 在最后,又关 ...
- 【转】STL空间配置器
STL空间配置器(allocator)在所有容器内部默默工作,负责空间的配置和回收.STL标准为空间配置器定义了标准接口(可见<STL源码剖析>P43).而具体实现细节则由各编译器实现版本 ...
- STL——空间配置器(构造和析构基本工具)
以STL的运用角度而言,空间配置器是最不需要介绍的东西,它总是隐藏在一切组件(更具体地说是指容器,container)的背后,默默工作,默默付出.但若以STL的实现角度而言,第一个需要介绍的就是空间配 ...
- STL空间配置器
1.什么是空间配置器? 空间配置器负责空间配置与管理.配置器是一个实现了动态空间配置.空间管理.空间释放的class template.以内存池方式实现小块内存管理分配.关于内存池概念可以点击:内存池 ...
- 咬碎STL空间配置器
STL空间配置器 一.开场白: 给我的感觉就是,了解是空间配置器的功能,是那么的明了:在看原理,我还是很开心:接下来是360度大转变: 那么长的变量或者函数命名.那么多的宏.不爽,不过,遇上我这种二货 ...
- STL——空间配置器(SGI-STL)
一. 空间配置器标准接口 参见<STL源码剖析>第二章-2.1.<memory>文件. 二.具备次配置力的SGI空间配置器 1. SGI STL的配置器与众不同,也与标准规范不 ...
- stl空间配置器简介
1. 符合STL标准的空间配器接口 STL是c++中使用非常广泛的一个标准库,它包含各种有用的容器.而空间配置器作为STL各种容器的背后的核心,负责容器内部内存的分配和释放.不过空间配置器可以分配的也 ...
随机推荐
- QF——OC中的KVC,KVO
KVC: (Key Value Coding) 键值编码 所谓KVC,其实就是不通过set和get方法访问对象属性,而是通过属性名字符串动态的去读取属性.KVC其实也是OC反射机制的一种运用. 之所以 ...
- jQuery1.9.1针对checkbox的调整
在jquery 1.8.x中的版本,我们对于checkbox的选中与不选中操作如下: 判断是否选中 $('#checkbox').prop('checked') 设置选中与不选中状态: $('#che ...
- HTML5兼容IE各版本的写法
IE下判断IE版本的语句 <!--[if lte IE 6]> <![endif]--> IE6及其以下版本可见 <!--[if lte IE 7]> < ...
- JAVA仿真之银行出纳员
学习例子是参照<thinking in java>中修改的,先贴上运行结果: 注意看红框之中的内容,这个仿真要达到这样一个目的: 1.客户队列(无优先级):每隔300MILLS生产一个客户 ...
- 一个简单的RTTI实现
RTTI是"Runtime Type Information"的缩写,意思是:运行时类型信息.它提供了运行时确定对象类型的方法. 最近在写的一些东西,不想使用MFC之类的框架,但是 ...
- android权限列表
原文:[转]android权限列表 访问登记属性 android.permission.ACCESS_CHECKIN_PROPERTIES ,读取或写入登记check-in数据库属性表的权限 获取错略 ...
- 第五章 Spring3.0 、Hibernate3.3与Struts2的整合 基于Annotation
Annotation的方式是通过注解的方式把Struts2中的Action.Dao层的实现类.Service层的实现类交由Spring管理,不需要在配置文件中进行配置.但为了方便,事务的管理依然使用的 ...
- poj2405---体积几何
#include <stdio.h> #include <stdlib.h> #include<math.h> #define pi acos(-1) int ma ...
- poj2013---二维数组指针使用
#include <stdio.h> #include <stdlib.h> #include<string.h> int main() { ; ][],arr2[ ...
- /dev/null &
java -cp .:ojdbc14.jar com.eucalyptus.dataguard.DBCheck dadifilm slbcheck Aa7788123 > /dev/null & ...