阅读基础:

  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. LUA学习笔记三·时间等操作系统库

    1.构造时间 2.时间制定格式输出 3.计时器(闭包)os.difftime (t2, t1) 返回以秒计算的时刻 t1 到 t2 的差值. (这里的时刻是由 os.time 返回的值). 在 POS ...

  2. C#正则表达式判断输入日期格式是否正确

      /// <summary>        /// 是否为日期型字符串        /// </summary>        /// <param name=&qu ...

  3. 拥抱基于jquery.deferred的ajax,和层层嵌套回调的ajax说拜拜

    前言 在项目中,无论是维护自己的代码,还是重构他人的项目代码,看到层层嵌套,异常冗余的某个function,那时我们的内心肯定是奔溃的! 在jquery1.5版本之前,如果我们某个操作需要多个ajax ...

  4. Android Studio 使用Lambda

    1,昨天在使用RxJava的时候,调用map.filter之类的方法要创建挺多的匿名内部类,所以我们打算试用一下Lambda让我们的代码更有阅读新性,下看一下我们的对比 在使用之前我们代码是这样的 O ...

  5. paper 125:NSCT——Nonsubsampled contourlet 变换程序(尺度不变性问题研究)

    原文地址:NSCT——Nonsubsampled contourlet 变换程序开发教程1作者:向望大海的鱼 08年,被老板逼得走投无路,xx所得项目看来是实在躲不过去,只好硬着头皮上.开发一款图像处 ...

  6. js 小数相加

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat=&qu ...

  7. 在Excel里用vba给合并的单元格添加注释

    Excel里使用VBA对已经合并的单元格添加注释,直接使用AddComment会报: 运行时错误 '1004':应用程序定义或者对象定义错误 找了很多文章都没找到怎么解决,最后发现在AddCommen ...

  8. Spring学习笔记之四----基于Annotation的Spring AOP编程

    你能使用@Aspect annotation将某个Java类标注为Aspect,这个Aspect类里的所有公有方法都可以成为一个Advice,Spring提供了5个Annotation去将某个方法标注 ...

  9. Js 拖动效果

    <!DOCTYPE html> <html> <head> <meta charset="utf8"> <title>j ...

  10. mha安装使用手册

    mha安装使用手册 注:目前mha最新的版本代码已经不放到google code网站了,而是放在github上,最新的版本为0.57,github链接如下: mha manager:https://g ...