STL---vector的内存分配策略

 2级策略,过程如下:

第一级 __malloc_alloc_template内存分配器

  该分配器是对malloc、realloc以及free的封装;

第二级  __default_alloc_template

是一个自维护的内存池,比如:

  s_free_list是这些空闲分区链的起始地址组成的数组,大小为16。这16个链表中每个链表中的空闲空间的大小都是固定的,第一个链表的空闲块大小是8bytes, 依次是16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120, 128bytes。

分配内存过程:

  1)如果申请的内存空间大于128bytes, 则交由第一个分配器处理

  2)分配器首先将申请内存的大小上调至8的倍数n,并根据n找出其对应的空闲链表地址__my_free_list

  3)如果该空闲链表中有可用的空闲块,则将此空闲块返回并更新__my_free_list,否则转到4)

  4)到这一步,说明__my_free_list中没有空闲块可用了,分配器会按照下面的步骤处理:

  a) 试着调用_s_chunk_alloc()申请大小为n*20的内存空间,注意的是,此时不一定能申请到n*20大小的内存空间

b) 如果只申请到大小为n的内存空间,则返回给用户,否则到c)

    c) 将申请到的n*x(a中说了,不一定是n*20)内存块取出一个返回给用户,其余的内存块链到空闲链表__my_free_list中

内存释放过程:

内存的释放过程比较简单,它接受两个参数,一个是指向要释放的内存块的指针p,另外一个表示要释放的内存块的大小n。分配器首先判断n,如果n>128bytes,则交由第一个分配器去处理;否则将该内存块加到相应的空闲链表中。

原文地址:https://www.cnblogs.com/luntai/p/6753994.html