#include<iostream>
using namespace std;
class MemPool{
private:
typedef struct Node{
void* data;
Node* next;
}Node;
Node* nodesHead_;
Node* firstFree_;
Node* usedNodes_;
void* data;
int capacity_;
int size_;
int unitSize_;
public:
MemPool(int unitSize,int maxSize):nodesHead_(new Node[maxSize]),firstFree_(nodesHead_),usedNodes_(NULL),
capacity_(maxSize),size_(0),unitSize_(unitSize){
data=operator new(unitSize_*capacity_);
for(int i=0;i<capacity_;++i)
nodesHead_[i].data=(char*)data+i*unitSize;
for(int i=0;i<capacity_-1;++i)
nodesHead_[i].next=nodesHead_+i+1;
nodesHead_[capacity_-1].next=NULL;
}
~MemPool(){
delete[] data;
delete[] nodesHead_;
}
void* Alloc(){
if(size_==capacity_)return NULL;
Node* tmp=firstFree_;
firstFree_=firstFree_->next;
++size_;
tmp->next=usedNodes_;
usedNodes_=tmp;
return tmp->data;
}
void Free(void* tmp){
if(usedNodes_==NULL)return;
Node* p=usedNodes_;
usedNodes_=usedNodes_->next;
p->data=tmp;
p->next=firstFree_;
firstFree_=p;
--size_;
}
};
int cnt=1;
class Test{
public:
int data;
char c;
Test(int d,char s):data(d),c(s){
cout<<"cnt="<<cnt++<<endl;
}
};
int main(){
MemPool pool(sizeof(Test),10);
for(int i=1;i<=20;++i){
Test* t=(Test*)pool.Alloc();
if(t!=NULL){
new(t) Test(10,'a');
cout<<t->data<<" "<<t->c<<endl;
t->~Test();
pool.Free((void*)t);
}
}
return 0;
}
元素之间用量表窜起来,包含没被使用的节点和已使用的节点。
一个简单地内存池
最新推荐文章于 2022-12-29 18:54:15 发布