#include <iostream>
using namespace std;
template<class T, int baseSize = 32>
class SimpleMemPool
{
public:
T* New()
{
if (!m_pFreeChunks) //如果空内存不存在,则重新申请一个大的block;
{
MemChunk* t = new MemChunk();
t->next = m_pMemChunks; //将内存块串起来;
m_pMemChunks = t;
for (int i = 0; i < baseSize - 1; i++)
{
t->chunks[i].next = &(t->chunks[i + 1].next);
}
t->chunks[baseSize - 1].next = NULL;
m_pFreeChunks = &(t->chunks[0]);
}
ObjectChunk* t = m_pFreeChunks;
m_pFreeChunks = m_pFreeChunks->next;
return reinterpret_cast<T*>(t);
}
void Delete(T* t) //删除T的一个内存
{
ObjectChunk* chunks = reinterpret_cast<ObjectChunk*>(t);
chunks->next = m_pFreeChunks;
m_pFreeChunks = chunks;
}
~SimpleMemPool()
{
MemChunk* temp;
while (m_pMemChunks)
{
temp = m_pMemChunks;
m_pMemChunks = m_pMemChunks->next;
delete temp;
}
}
SimpleMemPool(): m_pMemChunks(NULL), m_pFreeChunks(NULL){}
private:
#pragma pack(push, 1) //设置对其格式为1个字节
union ObjectChunk //最小使用的内存块
{
ObjectChunk* next;
char* buf[sizeof(T)];
};
struct MemChunk //可以直接拿来用的内存块
{
MemChunk* next;
ObjectChunk chunks[baseSize];
};
#pragma pack(pop)
MemChunk* m_pMemChunks;
ObjectChunk* m_pFreeChunks;
};
int main()
{
return 0;
}
内存池的简单实现
最新推荐文章于 2024-02-06 11:55:05 发布