实现一个内存池管理的类方法
模拟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; };
以上这篇实现一个内存池管理的类方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。