设计上:
(1)内存分配器管理器(nMemoryAlloc):
内存分配器管理器含有针对不同内存大小的内存池数组。每个内存池对象含有空闲节点链表,管理分配和回收的节点对象内存。
(2)链表节点内存:
链表节点对象含有变长内存成员,适合分配各个长度的内存对象。但同一个内存池对象中的节点内存大小是一致的。
(3)内存分配原则:
1)内存分配器nMemoryAlloc对于内存大小在1~1024 * 1024 字节之间小对象使用内存池的管理,否则就使用系统默认的分配和删除接口,让系统管理内存。
2)内存分配器适用的是定长的类型。
(4)静态存储区使用:
内存池管理器中的内存池数组是静态的,对外提供静态接口。
(5)空间配置器:
空间配置器使用内存池管理器来管理器内存
1、内存池类型
内存池分配节点,没有内存就向系统申请,否则从空闲列表中获取。
内存池含空闲节点链表。
class MemPool2
{
private:
struct _Node
{
_Node():next(NULL)
{
}
~_Node()
{
}
_Node* next;
unsigned char data[0];//变长内存
};
_Node* mFreeNodeList;
public:
unsigned long _all_alloc_size;//总共分配内存大小计数
unsigned long _all_alloc_num;//分配节点计数
unsigned long _all_use_num;//使用节点计数
unsigned long _all_free_num;//空闲节点计数
public:
MemPool2()
: mFreeNodeList(NULL),_all_alloc_size(0),_all_alloc_num(0),_all_use_num(0),_all_free_num(0)
{
}
void reset()//释放链表所有节点内存
{
_Node* p = mFreeNodeList;
while(p)
{
_all_free_num ++;
_Node* _p = p;
p = p->next;
char *tmp = (char *)_p;
free(tmp);
}
mFreeNodeList = NULL;
}
~MemPool2(void)
{
_Node* p = mFreeNodeList;
while(p)
{
_Node* _p = p;
p = p->next;
char *tmp = (char *)_p;
free(tmp);
}
mFreeNodeList = NULL;
}
_Node* __allocData(int datasize)//实际分配节点(没有内存就向系统申请,否则从空闲列表中获取)
{
if(!mFreeNodeList)
{
_all_alloc_size += (sizeof(_Node) + datasize);//记录总分配大小
_all_alloc_num ++;//记录分配节点数
char *tmp = (char *)malloc(sizeof(_Node) + datasize);
mFreeNodeList = (_Node *)tmp;
constructInPlace(mFreeNodeList);
}
_all_use_num ++;
_Node* p = mFreeNodeList;
mFreeNodeList = mFreeNodeList->next;
return p;//返回节点
}
unsigned char* alloc0(int datasize)//分配节点(没有内存就向系统申请,否则从空闲列表中获取)
{
_Node* p = __allocData(datasize);
return (unsigned char*)(p->data);
}
void freePtr(unsigned char* &p)//回收节点的内存回链表表头
{
if (p)
{
_Node* pNod = (_Node*)(p - sizeof(_Node));//上一个链表节点(分配过的就会有)
pNod->next = mFreeNodeList;
mFreeNodeList = pNod;
p = NULL;
_all_use_num