实现一个内存池管理的类方法
模拟STL中的freelist,有这个思想在内。
unionobj
{
unionobj*next;
charp[1];
};
classMemoryPool
{
public:
MemoryPool()
{
unionobj*temp;
m_memory.assign(5,(unionobj*)NULL);
for(inti=0;i<m_memory.size();i++)
{
for(intj=0;j<m_memory.size();j++)
{
temp=(obj*)malloc(sizeof(char)*(1<<(i+3)));
temp->next=m_memory[i];
m_memory[i]=temp;
}
}
}
char*mem_get(intsize)
{
intj;
if(size>128)
{
char*start=(char*)malloc(sizeof(char)*size);
returnstart;
}
intindex=freelist_index(size);
obj*temp=m_memory[index];
if(temp==NULL)//
{
for(j=index+1;j<m_memory.size();j++)
{
temp=m_memory[j];
if(temp!=NULL)
{
m_memory[j]=temp->next;
break;
}
}
if(j>=m_memory.size())
{
for(intj=0;j<m_memory.size();j++)
{
temp=(obj*)malloc(sizeof(char)*(1<<(index+3)));
temp->next=m_memory[index];
m_memory[index]=temp;
}
temp=m_memory[index];
m_memory[index]=temp->next;
return(char*)temp;
}
else
{
obj*cur;
intup_size=round_up(size);
for(inti=0;i<(1<<(j-index));i++)
{
cur=temp;
cur->next=m_memory[index];
m_memory[index]=cur;
temp=cur+up_size;
}
temp=m_memory[index];
m_memory[index]=temp->next;
return(char*)temp;
}
}
else
{
m_memory[index]=temp->next;
return(char*)temp;
}
}
voidmem_free(void*p,intsize)
{
if(size>128)
{
free(p);
return;
}
obj*temp=(obj*)p;
intindex=freelist_index(size);
temp->next=m_memory[index];
m_memory[index]=temp;
}
private:
enum{_ALIGN=8};//
intfreelist_index(int__bytes)
{
return(((__bytes)+(int)_ALIGN-1)/(size_t)_ALIGN-1);
}
intround_up(int__bytes)
{
return(((__bytes)+(int)_ALIGN-1)&~((int)_ALIGN-1));
}
vector<unionobj*>m_memory;
};
以上这篇实现一个内存池管理的类方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。