版权声明:本文为博主原创文章未经博主允许不得转载。 /fx/article/details/
Arena是leveldb使用场景的内存池的管理类这个类比较简单。它负责向系统申请内存块并将申请到的内存块放在vector<char *> blocks_
中進行管理。blocks_
的每个元素就是一个内存块的首地址在Arena的对象离开它的作用域的时候,调用析构函数将这些块进行释放它的申请的内存管悝结构如下所示
1. 当前块中所剩空间可以满足请求的话,直接从当前块中取出size大小的内存进行分配并更新alloc_ptr_
和alloc_bytes_remaining
的值
2. 当当前块不满足嘚时候,如果size大于kBlockSize/4
的话就重新分配一个大小为size的块,将这一块直接给请求如果size不大于kBlockSize/4
的话,就分配一个kBlockSize大小的块在这个块中分配内存。这样的话之前的那个块中剩余的内存就会浪费了
Arena还提供了分配地址对其的内存块的接口,用户调用这个接口的话分配到的内存的首地址是8的倍数。Arena 的这个分配地址对齐的内存块的接口其返回的内存块的起始地址是 8 的整数倍。也就是说返回的地址是这两种形式:"0x_______0"
和
"0x_______8"
。要是在分配内存的时候发现当前的地址并不是这种形式那就多分配点内存用来填补不够的 Byte,最多可能浪费 7 个 Byte