工作中常常需要,将一些数据放到内存中处理,有时候数据量好大多达3G的空间。
而且自己存储都是一些指针之类的东西,每次都要new,容器中存储的量好大,四五百万个。
而且最头疼的就是 析构的时候要等好久才能释放掉这个东西。查了好久 发现最流行的就是 空间换时间。
说了也惭愧,在学校中没怎么学到高深的东西,好多都是自己在工作中学习的。
同事说我可以看看Nginx的内存管理,我百度了下,有点那么意思就开始着手,写一个自己的内存管理。
代码如下:
class JHeapManagement
{
public:
JHeapManagement(){
_AddBuffer();
}
~JHeapManagement()
{
for(size_t i=0;i<currentheap;i++)
{
delete[] heaps[i];
}
heaps.clear();
}
void* AllocBytes(size_t size)
{
size_t allocsize = size;
if( (currentallocsize+allocsize)>HEAPBUFFERSIZE)
{
_AddBuffer();
}
char* buffer = heaps[currentheap];
char* retpos = buffer + currentallocsize;
currentallocsize += allocsize;
return (void*)retpos;
}
template<class T>
void* Alloc(size_t num = 1)
{
size_t allocsize = num*sizeof(T);
if( (currentallocsize+allocsize)>HEAPBUFFERSIZE)
{
_AddBuffer();
}
char* buffer = heaps[currentheap];
char* retpos = buffer + currentallocsize;
currentallocsize += allocsize;
return (void*)retpos;
}
private:
void _AddBuffer()
{
currentheap = heaps.size();
char* buffer = new char[HEAPBUFFERSIZE];
memset(buffer,0,HEAPBUFFERSIZE);
heaps.push_back(buffer);
currentallocsize = 0;
}
private:
vector<char*> heaps;
size_t currentheap;
size_t currentallocsize;
};
#define HEAPBUFFERSIZE 33554432 //32M
我定义的 每个块的大小是32M,伙伴们也可以随意设定。
用法:
JHeapManagement heap;
vector<path*> con;
for(int i=0;i<1000000;i++){
path* p = heap.Alloc<path>(/*参数默认为1 ,表示申请1个 T类型数据的大小*/);
con.push_back(p);
}
如果平时需要在内存中存放大量数据,自己写个内存管理还是有点用的。如果代码有什么不对的地方希望大家指点。