#include
#include
#include
using namespace std;
template
class MemPool
{
private:
//内存块结构
typedef struct BlockNode
{
void* _memory;//内存块地址
BlockNode* _next;//下一个blockNode
size_t _objNum;//内存块对象的个数
//构造函数---num表示申请对象的个数
BlockNode(size_t num)
:_objNum(num),
_next(nullptr)
{
_memory = malloc(_objNum*_size);
}
~BlockNode()
{
free(_memory);
_memory = nullptr;
_next = nullptr;
_objNum = 0;
}
}BlockNode;
protected:
static size_t _size;//单个对象的大小
T* _releaseMemory = nullptr;//释放的内存
BlockNode* _requestMemory;//申请的内存块
size_t _maxNum;//内存块最大的大小
size_t _useCount;//当前内存块已经使用的对象个数
protected:
//设置单个对象的大小
static size_t setSize()
{
return (sizeof(T) >= sizeof(T*) ? sizeof(T):sizeof(T*));
}
public:
MemPool()
:_useCount(0),
_releaseMemory(nullptr),
_maxNum(100000*_size)
{
//开始先申请32个_size大小的空间
_requestMemory = new BlockNode(32);
}
~MemPool()
{
BlockNode *cur = _requestMemory;
while (cur)
{
BlockNode* del = cur;
cur = cur->_next;
delete del; //会自动调用~BlockNode()
}
}
T* New()
{
//先在releaseMemory中找
if (_releaseMemory)
{
T* obj = _releaseMemory;
_releaseMemory = *((T**)_releaseMemory);//releaseMemory的前几个字节存储的是下一个节点的地址
return obj;
}
else
{
//判断requesetMemory中是否还有空闲内存
if (_requestMemory->_objNum == _useCount)
{
//取物理内存中申请一块内存
size_t size = 2 * _useCount >= _maxNum ? _maxNum : 2 * _useCount;
BlockNode* newBlock = new BlockNode(size);
newBlock->_next = _requestMemory;
_requestMemory = newBlock;
_useCount = 0;
}
//走到这里,一定有内存
T* obj = (T*)((char*)_requestMemory->_memory+_useCount*_size);
_useCount++;
return new(obj)T();//用定位new对这块空间初始化
}
}
void Delete(T* obj)
{
if (obj)
{
obj->~T();
*((T**)obj) = _releaseMemory;
_releaseMemory = obj;
}
}
};
//静态成员变量,类外初始化
template
size_t MemPool::_size = MemPool::setSize();
struct TreeNode
{
int _val;
TreeNode* _left;
TreeNode* _right;
};
void test1()
{
MemPool mp;
vector v;
for (int i = 0; i < 10; i++)
{
TreeNode* mem = mp.New();
v.push_back(mem);
}
for (int i = 0; i < 10; i++)
{
mp.Delete(v[i]);
}
}
void test2()
{
MemPool tnPool;
std::vector v1;
//申请110000个treeNode
//使用MemPoll申请
size_t begin1 = clock();
for (int i = 0; i < 110000; ++i)
{
v1.push_back(tnPool.New());
}
for (int i = 0; i < 110000; ++i)
{
tnPool.Delete(v1[i]);
}
v1.clear();
size_t end1 = clock();
//使用new和delete
size_t begin2 = clock();
for (int i = 0; i < 110000; ++i)
{
v1.push_back(new TreeNode);
}
for (int i = 0; i < 110000; ++i)
{
delete v1[i];
}
v1.clear();
size_t end2 = clock();
//使用malloc和free
size_t begin3 = clock();
for (int i = 0; i < 110000; ++i)
{
v1.push_back((TreeNode*)malloc(sizeof(TreeNode*)));
}
for (int i = 0; i < 110000; ++i)
{
free(v1[i]);
}
v1.clear();
size_t end3 = clock();
cout <<"MemPool " <