STL内存分配

原创 2018年04月16日 11:42:29
#### STL内存分配


由于小型的内存区块会因此内存分配碎片,SGI STL设计中使用了**双层级配置器**,**第一级配置器直接使用malloc()和free()**,申请内存大于128字节时调用;第二级配置器采用**内存池**的方式来管理。


STL内存分配器在文件`<stl_alloc.h>`中实现,**__malloc_alloc_template**和**__default_alloc_template**,分配器都需要实现两个接口allocate和deallocate。本文主要讨论第二级的分配器的实现。


**__default_alloc_template**:STL默认小内存分配器


#####分配器的实现


维护了16个free list,每个list上集合着大小分别为8,16,24,...128大小的内存块。如果请求的内存块大小大于128bytes,就转调用第一级配置器。使用了链表结构管理内存块:


```cpp
union obj{  
        union obj* free_list_link;  //当作为自由链表的一个结点时,存储其下一个节点的地址  
        char client_date[1];        //当其作为返回值时,返回的正好是分配内存的首地址  
    }  
```


相当于每个块前面4个字节用来存储节点头结构,结构体中client_data返回的实际上可用的内存块地址。free_list中找到合适的块后,会将下一个空闲块的地址写在原来这个free_list数组元素的位置。一般而言内存块是连续的。


![stl_default_allocator_free_list](https://images2015.cnblogs.com/blog/364303/201608/364303-20160831093958074-1199118235.jpg)






内存申请流程:


1. 大于128字节,使用第一级配置器向系统申请,malloc不成功会调用**set_new_handler**来处理异常。
2. 小于128字节,使用第二级适配器。如果有对应大小的free_list内存块,正常返回;如果free_list没有:

    -  2.1 向内存池要20个块大小的内存,内存池尽量满足;如果内存池也没有足够的内存:
    -  2.2 调用malloc从系统heap中申请内存,申请大小 **bytes_to_get=2*total_bytes+ROUND_UP(heap_size>>4)**,如果申请成功了并且内存池中有剩余内存,会将内存池的剩余内存非配给free_list。
3. 如果2.2失败,会求助于第一级配置器,主要是想借助于第一级配置器里的异常处理,例如**out_of_memory**中申请到一点内存。如果这一步也失败,那么就是彻底失败了。


##### 释放器


STL中调用deallocate后,对于小块内存,会放入到free_list中而不是释放回系统。

STL模板编程

-
  • 1970年01月01日 08:00

解析STL中典型的内存分配

1 vector 在C++中使用vector应该是非常频繁的,但是你是否知道vector在计算内存分配是如何么?        在c++中vector是非常类似数组,但是他比数组更加灵活,这就表...
  • wallwind
  • wallwind
  • 2012-03-23 02:26:24
  • 3900

c++ STL容器的内存分配

一.前言在使用STL各类容器的时候,有时会出现迭代器失效,引用(指针)失效等情况的而发生,即使看似你的操作都是合法的情况下。要了解问题的原因,我们就要了解C++中stl容器的内存分配策略。我们才知道在...
  • y1196645376
  • y1196645376
  • 2016-10-27 23:59:59
  • 2261

STL的内存分配(各种allocator)

有感于STL的内存管理   警告:本文是技术类文章,只适合码工们围观,非码工请跳过此坑 1. 背景 前些天在一个技术分享会上,某大牛说,STL使用了内存池,释放内存的时候,并不释放给OS,而...
  • xocoder
  • xocoder
  • 2013-04-04 17:52:46
  • 5443

STL源码剖析(一) - 内存分配

Allocaorallocator 指的是空间配置器,用于分配内存。STL中默认使用SGI STL alloc作为STL的内存分配器,虽然未能符合标准规格,但效率上更好。SGI STL也定义有一个符合...
  • qp120291570
  • qp120291570
  • 2014-04-21 17:06:51
  • 1933

STL中的内存分配方式——1

开始看STL源码分析,最开始讲到allocator,然后侯捷模拟了两种内存分配方式,感觉挺不错的所以记录下来:1.       是分配一块新的内存空间即:利用malloc或者new 来分配新的空间2....
  • zk_sima
  • zk_sima
  • 2011-03-04 16:28:00
  • 808

C++ STL 容器自定义内存分配器

一,基础篇 很多时候我们不要用默认的allocator的实现,我们需要自己的内存配置,所以我们可以做自己的分配器,这里说说必须要有的一些注意事项,因为有些是我犯错过的。 需要有自己的一些类...
  • mydriverc2
  • mydriverc2
  • 2015-06-05 14:31:12
  • 890

Linux内核中的内存分配

虽然Linux的内存管理相当复杂,但是使用起来还是比较简单的。 Linux内存分配器(__get_free_pages alloc_pages),基于伙伴系统,其中alloc_pages可以在分配高...
  • u011405813
  • u011405813
  • 2014-02-12 22:54:13
  • 747

STL中的内存分配器原理

STL中的内存分配器原理
  • u010140921
  • u010140921
  • 2015-04-16 21:02:34
  • 860

STL六大组件之——分配器(内存分配,好深奥的东西)

SGI设计了双层级配置器,第一级配置器直接使用malloc()和free(),第二级配置器则视情况采用不同的策略:当配置区块超过128bytes时,视之为“足够大”,便调用第一级配置器;当配置区小于1...
  • md521
  • md521
  • 2014-12-20 21:02:30
  • 4049
收藏助手
不良信息举报
您举报文章:STL内存分配
举报原因:
原因补充:

(最多只允许输入30个字)