本文介绍arena内存管理的设计和实现。
arena是leveldb中一个非常简单的内存池,以下做详细介绍。
1 数据结构
arena数据结构如下,其中,blocks_保存着所有创建的block;blocks_memory_保存所有block申请的总空间;alloc_ptr_和alloc_bytes_remaining_分别是当前block的内存分配起始地址 和 可用空间大小。
// Allocation state
char* alloc_ptr_;
size_t alloc_bytes_remaining_;
// Array of new[] allocated memory blocks
std::vector<char*> blocks_;
// Bytes of memory in blocks allocated so far
size_t blocks_memory_;
2 分配内存
inline char* Arena::Allocate(size_t bytes) {
// The semantics of what to return are a bit messy if we allow
// 0-byte allocations, so we disallow them here (we don't need
// them for our internal use).
assert(bytes > 0);
if (bytes <= alloc_bytes_remaining_) {
char* result = alloc_ptr_;
alloc_ptr_ += bytes;
alloc_bytes_remaining_ -= bytes;
return result;
}
return Allocate