补充常量
constexpr size_t MAX_BYTES=256*1024; //内存池能申请的空间上限
constexpr size_t NUM_LIST=208; //threadcache和centralcache哈希桶的个数
constexpr size_t NPAGES=129; //pagecache哈希桶个数
constexpr size_t PAGE_SHIFT=13; //一页8K,2^13
声明ThreadCache类
class ThreadCache
{
private:
FreeList _freelists[NUM_LIST]; //每一个线程都拥有一组自由链表
public:
ThreadCache() {
}
void* Allocate(size_t bytes); //申请空间
void Deallocate(void* p); //释放空间
private:
void* SolveListTooLong(FreeList& freelist, size_t n); //指定某自由链表归还n块空间
void* FetchFromCentralCache(size_t index, size_t bytes); //bytes为经过对齐后的字节数
};
static __declspec(thread) ThreadCache* TLSthreadcache = nullptr;
static __declspec(thread) ThreadCache TLSthreadcache = nullptr;*
表示对于TLSthreadcache这个变量,每一个线程都拥有一份属于自己的。
(不要忽略static,否则在头文件被多个源文件包含的场景下会出现重定义错误)
实现Allocate方法
RoundUp和Index方法统一为SizeMap类的静态方法
void* ThreadCache