阅读基础:

  Foo *pf = new Foo; 执行了两个步骤: 1)::operator new 向系统申请内存. 2) 调用Foo::Foo()构造函数构造实例.  ==> 申请内存,构造实例。

delete pf; delete; 执行了两个步骤: 1)调用Foo::~Foo()析构函数. 2). ::operator delete释放内存.         ==> 析构实例,释放内存。

Stl Alloc实现:

Stl为了高效利用内存,将这两部分分开,分成了四个操作( 构造::construct()/析构::destroy(),申请内存(alloc:allocate())/释放内存(alloc::deallocate() ).

  而设计的精髓是双层级内存分配器,主要是想实现一个内存池实现内存快速分配以及解决小型内存块频繁申请释放,耗费系统内存问题(free_list),第一级直接使用malloc和free,第二级视情况采用不同策略。

双层级内存分配器:

  1. 第一级配置器以malloc、free、realloc等C函数执行实际的内存配置、释放、重配置等操作,并实现出类似C++ new-handler的机制,它不能直接运用C++ new-handler的机制,因为它并非使用::operator new来配置内存。   所谓 c++ new-handeler机制是:你可以要求系统在内存配置需求无法被满足时,调用一个你所指定的函数。换句话说,一旦::operator new无法申请到内存时,在抛出std::bad_alloc异常状态之前,会先调用由用户指定的处理函数,该处理函数通常即被称为new-handler。

2. SGI第二级配置器的做法:如果要申请的内存大小超过128bytes时,就交给第一级配置器处理,当申请的内存小于128bytes时,则以内存池管理,此法又称为次层配置:每次向系统申请一大块内存,并维护一个自由链表(free_list),下次如果有相同大小的内存需求,就直接从自由链表中取出即可,如果释放小内存,就由配置器回收到自由链表中(只析构实例,但回收其占用的内存)。SGI第二级配置器会将任何小内存的申请需求量上调至8的倍数,并维护16个free-lists,每个Node管理大小分别为8,16,32,,,128的多个内存块。  以为申请的内存是8的倍数,而回收的内存也必然是8的倍数,只需放到合适的free_list节点即可。

记住几个点:

   1. 内存池通过start_free, end_free,去记录当前备用的空闲内存块(必然是一整块连续的空间), end_free - start_free的结果必然是8的倍数.

2. free_list不足以分配内存时,就会向内存池申请,重新申请内存时,start_free和end_free会更新,直到重新向系统申请一块新的内存。

3. 从内存池中获取的内存不足时,如果依然有一些零头内存(必然是8的倍数),将这些内存挂载到合适的free_list节点下,再向系统申请内存。

    所有容器的内存申请和释放都是靠这个Alloc在背后完成。

  

Stl源码剖析读书笔记之Alloc细节的更多相关文章

  1. STL源码剖析读书笔记之vector

    STL源码剖析读书笔记之vector 1.vector概述 vector是一种序列式容器,我的理解是vector就像数组.但是数组有一个很大的问题就是当我们分配 一个一定大小的数组的时候,起初也许我们 ...

  2. STL源码剖析读书笔记--第四章--序列式容器

    1.什么是序列式容器?什么是关联式容器? 书上给出的解释是,序列式容器中的元素是可序的(可理解为可以按序索引,不管这个索引是像数组一样的随机索引,还是像链表一样的顺序索引),但是元素值在索引顺序的方向 ...

  3. STL源码剖析读书笔记--第6章&第7章--算法与仿函数

    老实说,这两章内容还蛮多的,但是其实在应用中一点点了解比较好.所以我决定这两张在以后使用过程中零零散散地总结,这个时候就说些基本概念好了.实际上,这两个STL组件都及其重要,我不详述一方面是自己偷懒, ...

  4. STL源码分析读书笔记--第二章--空间配置器(allocator)

    声明:侯捷先生的STL源码剖析第二章个人感觉讲得蛮乱的,而且跟第三章有关,建议看完第三章再看第二章,网上有人上传了一篇读书笔记,觉得这个读书笔记的内容和编排还不错,我的这篇总结基本就延续了该读书笔记的 ...

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

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

  6. c++ stl源码剖析学习笔记(一)uninitialized_copy()函数

    template <class InputIterator, class ForwardIterator>inline ForwardIterator uninitialized_copy ...

  7. 重温《STL源码剖析》笔记 第三章

    源码之前,了无秘密. --侯杰 第三章:迭代器概念与traits编程技法 迭代器是一种smart pointer auto_Ptr 是一个用来包装原生指针(native pointer)的对象,声明狼 ...

  8. 重温《STL源码剖析》笔记 第六、七、八章 next_permutation (字典序)

    源码之前,了无秘密  ——侯杰 第六章算法 next_permutation 比如:01342 -> 01423 -> 01432 方法:从尾端开始往前寻找两个相邻的元素,令第一个元素为* ...

  9. 重温《STL源码剖析》笔记 第五章

    源码之前,了无秘密  ——侯杰 序列式容器 关联式容器 array(build in) RB-tree vector set heap   map priority-queue multiset li ...

随机推荐

  1. mysql dba系统学习(6)二进制日志binlog之二

    MySQL 5.5 中对于二进制日志 (binlog) 有 3 种不同的格式可选:Mixed,Statement,Row,默认格式是 Statement.总结一下这三种格式日志的优缺点.MySQL R ...

  2. Leetcode: Circular Array Loop

    You are given an array of positive and negative integers. If a number n at an index is positive, the ...

  3. csuoj 1119: Collecting Coins

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1119 1119: Collecting Coins Time Limit: 3 Sec  Memo ...

  4. JSSDK用法//////////////////zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

    参照微信官方文档,调试成功之后总结如下: 步骤一:绑定域名 先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”. 备注:登录后可在“开发者中心”查看对应的接口权限. 步骤二: ...

  5. javaSE第三篇

    1.classpath: set classpath = 类路径 用来找class文件 set classpath = .;(默认表示当前路径   2.数组的拷贝 方法一:Arrays.copyOf( ...

  6. C#调用WebService (转)

    1.1.Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求, ...

  7. node平台截取图片模块——jimp

    前几天介绍了一个简单的截图模块——iamges,虽然简单,但是功能还是有很多局限的地方. jimp的优势:1.简单,2.支持回调方式和ES6(promise)语法也可以链式调用 3. 丰富的api   ...

  8. svn版本搭建

    安装步骤如下: 1.yum install subversion   2.输入rpm -ql subversion查看安装位置,如下图:   我们知道svn在bin目录下生成了几个二进制文件. 输入 ...

  9. Sql Server 中一个非常强大的日期格式化函数

    Sql Server 中一个非常强大的日期格式化函数Select CONVERT(varchar(100), GETDATE(), 0)-- 05 16 2006 10:57AMSelect CONV ...

  10. centos中基于随机数,再加入班级学生姓名

    这只需要在上一篇的随机数中加入数值就可以了 代码如下 #!/bin/bash num=$(date +%N); c=(wanghao xieyunsheng) a=`expr $num % 39 ` ...