一个简单地内存池

来源:互联网 发布:诺基亚5250软件下载 编辑:程序博客网 时间:2024/06/05 14:14
#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;}
元素之间用量表窜起来,包含没被使用的节点和已使用的节点。
0 0
原创粉丝点击