[leveldb] arena内存分配
源码位置:
util/arena.h
util/arena.cc
Allocate接口
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 AllocateFallback(bytes);
}
判断剩余空间是否足够,如果足够则使用当前块的内存,否则走AllocateFallback逻辑。
AllocateFallback
char* Arena::AllocateFallback(size_t bytes) {
if (bytes > kBlockSize / 4) {
// Object is more than a quarter of our block size. Allocate it separately
// to avoid wasting too much space in leftover bytes.
char* result = AllocateNewBlock(bytes);
return result;
}
// We waste the remaining space in the current block.
alloc_ptr_ = AllocateNewBlock(kBlockSize);
alloc_bytes_remaining_ = kBlockSize;
char* result = alloc_ptr_;
alloc_ptr_ += bytes;
alloc_bytes_remaining_ -= bytes;
return result;
}
对于大于1kb的内存请求,直接使用operator new分配即可,否则分配一个4KB的block(注意:这个block是当前arena上下文中的最新的block),更新alloc_bytes_remaining_为4K,alloc_ptr_为新block的指针即可。然后就是普通的在大块内存上划分小块的逻辑。
arena不支持释放具体block或具体地址的内存
只有在析构arena时之前申请的内存才会被释放。