模組資訊
util/arena.h
util/arena.cc
模組概要
用於實現乙個簡單的記憶體池,有兩種記憶體分配方式,一種是普通分配,一種是對齊分配
主要介面
方法說明
char* arena::allocate(size_t bytes)
普通方式分配記憶體
char* arena::allocatealigned(size_t bytes)
對齊方式分配記憶體
char* arena::allocatefallback(size_t bytes)
記憶體追加
char* arena::allocatenewblock(size_t block_bytes)
建立新的記憶體塊
原始碼分析
arena::allocate
inline char* arena::allocate(size_t bytes)
//否則要新申請空間
return allocatefallback(bytes);
}
arena::allocatefallbackchar* arena::allocatefallback(size_t bytes)
//如果需求空間比剩餘空間大,且需求空間小於1k,這也說明剩餘空間比1k小,就可以申請塊大小的空間
//雖然也會浪費部分空間,但是浪費的空間小於1k
alloc_ptr_ = allocatenewblock(kblocksize);
alloc_bytes_remaining_ = kblocksize;
char* result = alloc_ptr_;
alloc_ptr_ += bytes;
alloc_bytes_remaining_ -= bytes;
return result;
}
arena::allocatenewblockchar* arena::allocatenewblock(size_t block_bytes)
arena::allocatealignedchar* arena::allocatealigned(size_t bytes) else
assert((reinterpret_cast(result) & (align - 1)) == 0);
return result;
}
to_do leveldb原始碼分析之記憶體池Arena
這篇部落格主要講解下leveldb記憶體池,記憶體池很多地方都有用到,像linux核心也有個記憶體池。記憶體池的存在主要就是減少malloc或者new呼叫的次數,較少記憶體分配所帶來的系統開銷。arena類採用vector來儲存每次分配記憶體的指標,每一次分配的記憶體,我們稱為乙個塊block。bl...
leveldb原始碼分析1
leveldb是乙個key value型的儲存引擎,由google開發,並宣布在bsd許可下開放源 plain git clone plain cd leveldb make all 此時生成libleveldb.a庫檔案。拷貝leveldb的標頭檔案到 usr include下 plain cp ...
levelDB原始碼分析 SSTable
sstable是bigtable中至關重要的一塊,對於leveldb來說也是如此,對leveldb的sstable實現細節的了解也有助於了解bigtable中一些實現細節。本節內容主要講述sstable的靜態布局結構,sstable檔案形成了不同level的層級結構,至於這個層級結構是如何形成的我們...