STL源码剖析学习二:空间配置器(allocator)

标准接口:
vlaue_type
pointer
const_pointer
reference
const_reference
size_type
difference_type
rebind
allocator()--default constructor
allocator(const allocator<U>&--copy constructor
~allocator()--destructor
address(reference x)const--return address of elem
address(const_reference x)const
allocate(size_type n, const void*= 0)--alloc memory
deallocator(pointer p, size_type n)--return memory
max_size()--return memory alloc succesfully
construct(pointer p, const T& x)--=new((void*) p) T(x)
destroy()--=p->T()

STL allocator把内存配置和对象的构造分开
allocate负责内存配置,deallocate负责内存的释放
construct负责对象构造,destroy负责对象析构

SGI std::alloc设计思想:
1.向system heap要求空间
2.考虑多线程状态
3.考虑内存不足的应变措施
4.考虑过多小型区块导致的内存碎片问题

以malloc和free完成内存的配置与释放

考虑过多小型区块导致的内存碎片问题,SGI设计了双层配置器
1.当配置区块大于128bytes时,调用第一级配置器,直接使用malloc和free
2.当配置区块小于128bytes时,调用第二级配置器,采用内存池的整理方式

第一级配置器:
1.allocate直接使用malloc
2.deallocate直接使用free
3.当内存不足时,用malloc free realloc执行实际的内存配置、释放、重配置操作,以实现出类似于c++中new-handler的机制

new-handler的机制:可以要求系统在内存配置需求无法满足的情况下,调用一个你指定的函数
==>一旦new无法完成任务,在丢出bad_alloc异常之前可以先调用指定的处理函数

第二级配置器:
当配置的内存较小时,用内存池的方式管理(次层配置):
每次配置一大块内存,并且维护一个自由链表,下次若有相同大小的内存需求,则直接从自由链表中取出,若有释放的内存则收入到自由链表中。
为方便管理,将任何小额区块的内存需求量上调至8的倍数

当自由链表中没有可用区块时调用refill,为自由链表重新填充空间。
新的空间将由chunk_alloc完成

chunk_alloc:
判断内存池中的内存,若果足够,则分出20个区块给自由链表
如果不足20个,但至少有一个,则有多少拨多少
如果一个都没有,则利用malloc从heap中配置内存,注入内存池中
要是整个system heap中内存都不够了,则寻找是否有尚有未用区块且区块足够大的自由链表,有的话就挖出来用
如果还没有,则调用第一级配置器,new-handler机制
如果还不行,就bad_alloc异常

内存基本处理工具:
uninitialized_copy:为了将内存的配置跟对象的构造分离开来,对调用拷贝构造函数来构造未初始化区域中的对象,调用construct
调用的结果是要么构造出全部对象,要么就什么都没有
uninitialized_fill
uninitialized_fill_n
上述三个函数分别对应高层的STL算法copy(),fill(),fill_n()

转载于:https://www.cnblogs.com/w0w0/archive/2012/04/21/2461378.html

STL源码剖析学习二:空间配置器(allocator)相关推荐

  1. STL源码剖析学习七:stack和queue

    STL源码剖析学习七:stack和queue stack是一种先进后出的数据结构,只有一个出口. 允许新增.删除.获取最顶端的元素,没有任何办法可以存取其他元素,不允许有遍历行为. 缺省情况下用deq ...

  2. STL源码剖析学习之increment、decrement、dereference实现源码

    //STL之increment.decrement.dereference实现源码 //学习目的:STL实现原理.操作符(++i,i++,*等操作符的重载) //increment/dereferen ...

  3. STL源码剖析—学习记录

    提示:建议看完侯捷老师的STL标准库视频后,再看这本书,会看的下去一些!本人对其中重点内容和概念进行了提取,希望对一起前行的人有些许帮助,码字不易,欢迎点个赞呦! 文章目录 一.可能令你困惑的C++语 ...

  4. Python源码剖析学习二

    Python对象初探 在Python中,一切都是对象.连类型也是一种对象. 在Python中,对象就是为C中的结构体在堆上申请的一块内存.一般来说,对象是不能被静态初始化的,并且也不能在栈空间上生存. ...

  5. STL源码剖析学习十四:算法之set相关算法

    STL中定义的set要求元素不得重复且已经排序 set算法要求的都是有序区间,但元素可以重复出现 另外提供的hash版本的set因为其元素无序,因此不能作为set函数的参数 set算法前4个参数分别表 ...

  6. STL源码剖析(二)__alloc_traits特性

    上篇文章介绍了内存分配器allocator的设计,此篇介绍内存分配器的属性. __alloc_traits类 1,__alloc_traits类提供了一个顶层内存分配器的萃取器,可以使用_Alloc的 ...

  7. STL源码剖析 第八章 配接器

    设计模式:将一个类的接口转化为另外一个类的接口 配接器的概观和分类 改变仿函数接口  函数配接器  :queue和stack 通过修饰deque函数接口来实现 改变容器接口      容器配接器  : ...

  8. stl源码剖析_《STL源码剖析》学习笔记——空间配置器

    目录 1. 空间配置器概述 2. 构造和析构基本工具 3. 空间的配置与释放,std::alloc 4. 内存基本处理工具 1. 空间配置器概述 从STL的实现角度来看,空间配置器的位置尤为重要,整个 ...

  9. 【《STL源码剖析》提炼总结】 第1节:空间配置器 allocator

    文章目录 一. 什么是空间配置器 二. STL allocator的四个操作: allocate,deallocate,construct,destroy `construct()` `destroy ...

最新文章

  1. Android App优化之延长电池续航时间
  2. 【C++】Effective STL:50条有效使用STL的经验
  3. 有人能用外行人解释什么是JSONP吗? [重复]
  4. ESP8266 wifi模块连接上了热点之后 与服务器建立了tcp连接并进入了透传模式,如果关掉热点wifi模块的tcp连接没有切断,为什么
  5. c#使用Path.Combine的一个坑
  6. Python PyInstaller 安装 和 使用教程( 打包生成 exe )
  7. java整属取余数_js取整数、取余数的方法
  8. 学python有前途吗-三十岁了,从零开始学python还有前途吗?
  9. QL Server 2008新特性:FILESTREAM
  10. GloVe损失函数的理解
  11. 二维码软件如何扫描二维码打开网页
  12. 合唱队形c语言编程,洛谷 P1091 合唱队形
  13. 联发科正式发布Helio P23/P30 SoC:GPU、基带大升级
  14. Cannot run code from this file in conjunction with non encoded files
  15. echarts 环形图 不同区域背景色自定义
  16. GitHub 的 2021 年度报告,全球程序员好像都在卷呐!
  17. 配置CiscoWorks 2000 ANI同步
  18. PgSQL修改字段备注
  19. 组合总和 Ⅳ(超详细讲解)
  20. MySQL 5.7调优参数详解

热门文章

  1. 网页获取客户端IP的两种方法
  2. 图的四种最短路径算法
  3. 阿里云天池 Python训练营Task4: Python数据分析:从0完成一个数据分析实战 学习笔记
  4. Spring Cloud构建微服务架构-Hystrix监控面板
  5. 《树莓派实战秘籍》——1.17 技巧17添加重启按钮
  6. clear ,refresh,free
  7. python object类
  8. Mysql学习总结(12)——21分钟Mysql入门教程
  9. mod_wsgi的工作模式和配置
  10. apk,task,进程区别