zoukankan      html  css  js  c++  java
  • stl里面的空间适配器

    一般而言,如果频繁地向system heap申请和释放空间很小的内存空间块(小于128B的),就会对系统内存资源产生很多内存碎片(fragment)的问题,而C++的::operator new() 和 ::opeartor delete() 相当于C的 malloc() 和 free(), 所以stl为此设置了双层的内存配置器,当申请的空间大于128B时 就使用第一级配置器,如果小于128B就使用第二级配置器

    关于第一级allocator: 实际是使用malloc free realloc 等C函数执行实际的内存配置,释放,重配置操作

    关于第二级allocator: 本质上是一个内存池(memory pool), 先配置一大块的内存, 并用自由链表(free list)进行维护·

     内存池的结构:

    一共有16个free list 各自管理大小为 8,16,24,32,40,,,,128Bytes的小额区块

     

    freelist 使用了union 结构来节省对指针所造成的内存开销如下图:

    unionobj {
    
    union obj * free_list_link;
    
    char client_data[1]; /* The client sees this. */
    
    };

    题外思考:

     

    我们现在真的还需要考虑内存碎片的问题吗?https://www.zhihu.com/question/21894104

     推荐阅读陈硕的回答以及他所给出的链接.

     

    一个或许让程序员无需关心内存碎片问题的malloc的api:

    TCmalloc 的介绍: http://goog-perftools.sourceforge.net/doc/tcmalloc.html

  • 相关阅读:
    gulp备忘
    好文收藏
    妙味H5交互篇备忘
    [CSS3备忘] transform animation 等
    css选择器总结
    flexbox备忘
    函数
    继承2
    在 Swift 中实现单例方法
    浅谈 Swift 中的 Optionals
  • 原文地址:https://www.cnblogs.com/jusonalien/p/5243809.html
Copyright © 2011-2022 走看看