在上一篇里面说到,vs 的标准分配器 std::allocator
并没有做内存管理。gnu的历史版本 2.9 中的标准分配器 std::allocator 也没有做内存管理,但是它提供的 extended allocator 中,std::alloc 就是一个做了内存管理的版本。在 gnu 新版本中,__gnu_cxx::__pool_alloc<_Ty> 就是 G2.9 的 std::alloc 的化身。
下面先分析以下 std::alloc 的运行模式,再下一篇分析具体代码。
不过先需要前三篇的基础:
数据结构
- 一个指针数组
free_list[16]
,分别负责16条不同大小的 block,以 8 bytes 为间隔。比如 #0 负责 8 bytes 的 block,#3 负责 32 bytes 的 block。当客户端需要 size 大小的内存时,首先被调整到 8 的倍数,然后到free_list
相应的位置索取。 - 当用户所索取的 block 大小超过了 free_list 所能提供的最大的大小也就是 128 字节时,会转而调用 malloc 函数。
- 以用户索取 size = 32 为例。如果 #3 位置上没有分