学习了 levelDB源码分析-Arena和leveldb学习:内存池Arena
图片是上面第一篇博客里的:
1.成员变量blocks_是个vector,它的每个元素都是一个char*指针,指向一段内存(或者说是char[]数组). 在Arena的析构函数里,会遍历该vector的每个元素,使用delete[]删除所有分配的内存。 blocks_的主要作用也在于此,保存了分配的所有内存的地址,在Arena析构时可以找到所有的地址,依次释放掉内存。
2. alloc_ptr_在某一时刻指向的是如图中所示的blocks_的其中一个元素指向内存的未使用空间的首地址。
3. private的函数AllocateNewBlock是本类最底层的函数,实现主要步骤是:
char* result = new char[block_bytes]; /*分配内存*/
blocks_.push_back(result);/*将内存首地址放到blocks里,用于析构时释放掉。*/
4. public接口主要是两个:Allocate 和 AllocateAligned . 而这两个函数主要是在一定条件下调用private函数AllocateFallback, 而AllocateFallback是在一定条件下调用AllocateNewBlock, 所以最终public接口还是主要调用的AllocateNewBlock.
5. 至于成员变量alloc_ptr_ 和alloc_bytes_remaining_ 主要用在所需分配内存特别小的时候,直接利用当前alloc_ptr指向的剩余内存char*。