添加Alloc空间配置器的类声明

This commit is contained in:
邹晓航
2014-09-17 09:56:06 +08:00
parent dfe5081a99
commit d8748d5c54

49
TinySTL/Alloc.h Normal file
View 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-listn从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