一、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内存配置器的更多相关文章

  1. SGI STL内存配置器存在内存泄漏吗?

    阅读了SGI的源码后对STL很是膜拜,很高质量的源码,从中学到了很多.温故而知新!下文中所有STL如无特殊说明均指SGI版本实现. STL 内存配置器 STL对内存管理最核心部分我觉得是其将C++对象 ...

  2. 自己动手实现STL 01:内存配置器的实现(stl_alloc.h)

    一.前言 在STL中,容器是其中的重中之重,基本的STL中的算法,仿函数等都是围绕着容器实现的功能.而,内存配置器,是容器的实现的基础.所以,我第一次要去编写便是内存配置器的实现.在STL中,内存配置 ...

  3. stl空间配置器线程安全问题补充

    摘要 在上一篇博客<STL空间配置器那点事>简单介绍了空间配置器的基本实现 两级空间配置器处理,一级相关细节问题,同时简单描述了STL各组件之间的关系以及设计到的设计模式等. 在最后,又关 ...

  4. 【转】STL空间配置器

    STL空间配置器(allocator)在所有容器内部默默工作,负责空间的配置和回收.STL标准为空间配置器定义了标准接口(可见<STL源码剖析>P43).而具体实现细节则由各编译器实现版本 ...

  5. STL——空间配置器(构造和析构基本工具)

    以STL的运用角度而言,空间配置器是最不需要介绍的东西,它总是隐藏在一切组件(更具体地说是指容器,container)的背后,默默工作,默默付出.但若以STL的实现角度而言,第一个需要介绍的就是空间配 ...

  6. STL空间配置器

    1.什么是空间配置器? 空间配置器负责空间配置与管理.配置器是一个实现了动态空间配置.空间管理.空间释放的class template.以内存池方式实现小块内存管理分配.关于内存池概念可以点击:内存池 ...

  7. 咬碎STL空间配置器

    STL空间配置器 一.开场白: 给我的感觉就是,了解是空间配置器的功能,是那么的明了:在看原理,我还是很开心:接下来是360度大转变: 那么长的变量或者函数命名.那么多的宏.不爽,不过,遇上我这种二货 ...

  8. STL——空间配置器(SGI-STL)

    一. 空间配置器标准接口 参见<STL源码剖析>第二章-2.1.<memory>文件. 二.具备次配置力的SGI空间配置器 1. SGI STL的配置器与众不同,也与标准规范不 ...

  9. stl空间配置器简介

    1. 符合STL标准的空间配器接口 STL是c++中使用非常广泛的一个标准库,它包含各种有用的容器.而空间配置器作为STL各种容器的背后的核心,负责容器内部内存的分配和释放.不过空间配置器可以分配的也 ...

随机推荐

  1. 【phpcms-v9】如何实现在含有子栏目的栏目下添加内容?

    对于题目的解释: 假设现在有一个一级栏目 为:栏目1 其下有二级栏目  :栏目1=>栏目11,栏目1=>栏目12,栏目1=>栏目13 同时栏目1下有文章列表 : 栏目1-----文章 ...

  2. Linux软连接与硬连接 .

    http://blog.csdn.net/ningxinghai/article/details/7342338 Linux的软连接相当于window系统的快捷方式,如我们桌面的QQ等. 硬连接相当于 ...

  3. markdown流程图

    markdown流程图 markdown流程图 markdown流程图语法:https://github.com/adrai/flowchart.js 定义元素阶段的语法是 tag=>type: ...

  4. css3实现三角形,聊天背景气泡,心形等形状

    1.聊天背景气泡: css代码如下: #talkbubble {width: 120px;margin:auto; background: red; position: relative; -moz- ...

  5. [php]php时间戳当中关于时区的问题

    PHP_VERSION = 5.5.11 话说php函数 time() 的起始时间戳是从:GMT 1970-01-01 00:00:00 开始算起的 写了点测试代码: $gmt1 = strtotim ...

  6. git彻底删除commit记录的方法

    在github上,如果非默认分支的话,直接用以下方法: git reset --hard <commit_id> git push origin HEAD --force 如是默认分支,需 ...

  7. linux mail 简操作

    1. 如何查看linux的mailqueue 检查所传送的电子邮件是否送出,或滞留在邮件服务器中 语法:/usr/lib/sendmail -bp 2. 如何发送mail 1)将文件当做电子邮件的内容 ...

  8. #pragma anon_unions, #pragma no_anon_unions

    #pragma anon_unions, #pragma no_anon_unions 这些编译指示启用和禁用对匿名结构和联合的支持. 缺省设置 缺省值为 #pragma no_anon_unions ...

  9. VM 映像 PowerShell 教学系列博客文章

     编辑人员注释:本文章是与Microsoft Azure工程的项目经理Kay Singh共同撰写的 正如我在第一篇博客文章中所承诺的,我又回来了,为大家分步介绍如何在PowerShell中使用VM ...

  10. iOS6和iOS7代码的适配(3)——坐标适配

    由于iOS7里面status bar和视图是重叠在一起了,所以应用的y坐标就没法和以前一致了,需要重新计算设定.基本上,你的应用用Xcode5运行一下就能看见这个问题,这里写了一个最简单的例子,一个V ...