SGI STL第一级配置器:

template<int inst>
class __malloc_alloc_template{...};
其中:
1.allocate()直接使用malloc(),deallocate()直接使用free().
2.模拟C++的set_new_handler()以处理内存不足的情况.

SGI STL第二级配置器:

template<bool threads,int inst>
class _default_alloc_template{...};
其中:
1.维护16个自由链表(free lists),负责16种小型区块的次配置能力.
内存池以malloca()配置而得.如果内存不足,专用第一级配置器(那儿有处理程序)
2.如果需求区块大于128bytes,就转调用第一级配置器.

不管使用的是第一级配置器还是第二级配置器,都是用malloc()实现的。

第一级配置器

第一级配置器以malloc(),free(),realloc()等C函数执行实际的内存配置和释放,冲配置操作,并实现出累死C++ newhandler的机制,是的,它不能直接运用C++new-handler机制,因为它并非 使用::operator new来配置内存。(所谓C++new handler机制是,你可以要求系统在内存配置需求无法被满足时,调用一个你所指定的函数)

SGI第一季配置器的allocate()和realloc()都是在调用malloc()和realloc()不成功后,改调用oom_malloc()和oom_realloc(),后两者都有内循环,不断调用“内存不足处理例程”,期望在某次调用后,获得足够的内存而圆满完成任务,但如果“内存不足例程”未被客端设定,oom_malloc()和oom_realloc()便老实不客气地调用_THROW_BAD_ALLOC,丢出bad_alloc异常信息,或者利用exit(1)中止程序。

第二级配置器

SGI第二级配置器的做法是,如果区块够大,超过128bytes时,就移交第一级配置器处理,当区块小玉128bytes时,则以内存池(memory pool)管理,此法又成为次层配置:每配置一大块内存,并维护对应之自由链表。下次若再有相同大小的内存需求,就直接从free-lists中取出,如果客端释还小额区块,就由配置器回收到自由链表中,为了方便管理,SGI第二级配置器会主动将任何小额区块的内存需求量上升至8的倍数(例如客端要求30bytes,就自动调整为32bytes),并维护16个free-lists,各自管理大小分别为8,16,24,32,40,48,56,64。。。128bytes的小额区块,自由链表的结点结构如下:

union obj{
union obj *free_list_link;
char client _data[1];
};//使用union节省内存

空间配置函数allocate()

身为一个配置器,_default_alloc_template拥有配置器的标准接口函数allocate(),此函数首先判断区块的大小,大于128bytes就调用第一级配置器,小玉128bytes就检查对应的自由链表,如果没有可用的区块,就将区块大小上调至8的倍数边界,然后调用refill()准备为free list重新填充空间。

《STL源码剖析》STL的双层配置器的更多相关文章

  1. 《STL源码剖析》chapter2空间配置器allocator

    为什么不说allocator是内存配置器而说是空间配置器,因为空间不一定是内存,也可以是磁盘或其他辅助介质.是的,你可以写一个allocator,直接向硬盘取空间.sgi stl提供的配置器,配置的对 ...

  2. STL源码分析之第二级配置器

    前言 第一级是直接调用malloc分配空间, 调用free释放空间, 第二级三就是建立一个内存池, 小于128字节的申请都直接在内存池申请, 不直接调用malloc和free. 本节分析第二级空间配置 ...

  3. STL源码分析之第一级配置器

    前言 上一节我们分析了空间配置器对new的配置, 而STL将空间配置器分为了两级, 第一级是直接调用malloc分配空间, 调用free释放空间, 第二级三就是建立一个内存池, 小于128字节的申请都 ...

  4. STL源码剖析 — 空间配置器(allocator)

    前言 以STL的实现角度而言,第一个需要介绍的就是空间配置器,因为整个STL的操作对象都存放在容器之中. 你完全可以实现一个直接向硬件存取空间的allocator. 下面介绍的是SGI STL提供的配 ...

  5. STL源码剖析之空间配置器

    本文大致对STL中的空间配置器进行一个简单的讲解,由于只是一篇博客类型的文章,无法将源码表现到面面俱到,所以真正感兴趣的码农们可以从源码中或者<STL源码剖析>仔细了解一下. 1,为什么S ...

  6. 《STL源码剖析》环境配置

    首先,去侯捷网站下载相关文档:http://jjhou.boolan.com/jjwbooks-tass.htm. 这本书采用的是Cygnus C++ 2.91 for windows.下载地址:ht ...

  7. STL"源码"剖析-重点知识总结

    STL是C++重要的组件之一,大学时看过<STL源码剖析>这本书,这几天复习了一下,总结出以下LZ认为比较重要的知识点,内容有点略多 :) 1.STL概述 STL提供六大组件,彼此可以组合 ...

  8. 【转载】STL"源码"剖析-重点知识总结

    原文:STL"源码"剖析-重点知识总结 STL是C++重要的组件之一,大学时看过<STL源码剖析>这本书,这几天复习了一下,总结出以下LZ认为比较重要的知识点,内容有点 ...

  9. (原创滴~)STL源码剖析读书总结1——GP和内存管理

    读完侯捷先生的<STL源码剖析>,感觉真如他本人所说的"庖丁解牛,恢恢乎游刃有余",STL底层的实现一览无余,给人一种自己的C++水平又提升了一个level的幻觉,呵呵 ...

  10. STL"源码"剖析

    STL"源码"剖析-重点知识总结   STL是C++重要的组件之一,大学时看过<STL源码剖析>这本书,这几天复习了一下,总结出以下LZ认为比较重要的知识点,内容有点略 ...

随机推荐

  1. vulnhub靶场之EMPIRE

    准备: 攻击机:虚拟机kali.本机win10. 靶机:EMPIRE: BREAKOUT,地址我这里设置的桥接,下载地址:https://download.vulnhub.com/empire/02- ...

  2. JSP中request对象的简单实用,实现简单的注册以及个人信息的展示

    JSP中Request对象的使用 概述:request对象主要用于接收客户端发送来的请求信息,客户端的请求信息被封装在request对象中,通过它可以了解到客户的需求,然后做出响应.主要封装了用户提交 ...

  3. MassTransit | .NET 分布式应用框架

    引言 A free, open-source distributed application framework for .NET. 一个免费.开源的.NET 分布式应用框架. -- MassTran ...

  4. 这次彻底读透 Redis

    1. Redis 管道 我们通常使用 Redis 的方式是,发送命令,命令排队,Redis 执行,然后返回结果,这个过程称为Round trip time(简称RTT, 往返时间).但是如果有多条命令 ...

  5. 十八、Service的应用

    Service 的应用 ClusterIP ​clusterIP 主要在每个 node 节点使用 ipvs,将发向 clusterIP 对应端口的数据,转发到 kube-proxy 中.然后 kube ...

  6. vulnhub靶场之NOOB: 1

    准备: 攻击机:虚拟机kali.本机win10. 靶机:NOOB: 1,网段地址我这里设置的桥接,所以与本机电脑在同一网段,下载地址:https://download.vulnhub.com/noob ...

  7. Vue报错:component has been registered but not used

    原因: ​​eslint​​代码检查到你注册了组件但没有使用,然后就报错了.比如代码: 比如​​Vue​​​中注册了​​File​​组件,而实际上却没有使用到(直接取消注册为好): ... impor ...

  8. 1B踩坑大王

    题目链接 题目大意: 人们常用的电子表格软件(比如: Excel)采用如下所述的坐标系统: 第一列被标为 A,第二列为 B,以此类推,第 262626 列为 Z.接下来为由两个字母构成的列号: 第 2 ...

  9. ZWS物联网云平台为电器设备智能化,提升产品竞争力

    从目前的消费趋势来看,家居电器设备的消费发力点在于年轻人.他们基本由"80"."90后"组成,对于消费理念更加的新颖,对于新产品与新观念更加容易接受.不过相对的 ...

  10. ArcGIS QGIS学习二:图层如何只显示需要的部分几何面数据(附最新坐标边界下载全国省市区县乡镇)

    目录 前言 准备SHP数据 ArcMap 的筛选 QGIS 的筛选 如何编写查询条件 前言 当我们用GIS软件打开一个SHP文件的时候,会显示出里面全部的几何图形,假如我只想要其中的一部分数据显示出来 ...