添加Alloc空间配置器的类声明
This commit is contained in:
49
TinySTL/Alloc.h
Normal file
49
TinySTL/Alloc.h
Normal file
@@ -0,0 +1,49 @@
|
||||
#ifndef _ALLOC_H_
|
||||
#define _ALLOC_H_
|
||||
|
||||
namespace TinySTL{
|
||||
|
||||
/*
|
||||
**空间配置器
|
||||
*/
|
||||
class alloc{
|
||||
private:
|
||||
enum EAlign{ ALIGN = 8};//小型区块的上调边界
|
||||
enum EMaxBytes{ MAXBYTES = 128};//小型区块的上限
|
||||
enum ENFreeLists{ NFREELISTS = (EMaxBytes::MAXBYTES / EAlign::ALIGN)};//free-lists的个数
|
||||
private:
|
||||
//free-lists的节点构造
|
||||
union obj{
|
||||
union obj *next;
|
||||
char client[1];
|
||||
};
|
||||
|
||||
static obj *free_list[ENFreeLists::NFREELISTS];
|
||||
private:
|
||||
static char *start_free;//内存池起始位置
|
||||
static char *end_free;//内存池结束位置
|
||||
static size_t heap_size;//
|
||||
private:
|
||||
//将bytes上调至8的倍数
|
||||
static size_t ROUND_UP(size_t bytes){
|
||||
return ((bytes + EAlign::ALIGN - 1) & ~(EAlign::ALIGN - 1));
|
||||
}
|
||||
//根据区块大小,决定使用第n号free-list,n从0开始计算
|
||||
static size_t FREELIST_INDEX(size_t bytes){
|
||||
return (((bytes)+EAlign::ALIGN - 1) / EAlign::ALIGN - 1);
|
||||
}
|
||||
//返回一个大小为n的对象,并可能加入大小为n的其他区块到free-list
|
||||
static void *refill(size_t n);
|
||||
//配置一大块空间,可容纳nobjs个大小为size的区块
|
||||
//如果配置nobjs个区块有所不便,nobjs可能会降低
|
||||
static char *chunk_alloc(size_t size, size_t& nobjs);
|
||||
|
||||
public:
|
||||
static void *allocate(size_t bytes);
|
||||
static void deallocate(void *ptr, size_t bytes);
|
||||
static void *reallocate(void *ptr, size_t old_sz, size_t new_sz);
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user