C++内存池的极简版实现

来源:互联网 发布:打码网站源码 编辑:程序博客网 时间:2024/05/22 17:14

       当在一个函数中需要大量使用new来申请临时用的数组或对象时,用完之后需要对每一个new出来的数组进行释放,特别当一个函数特别长的时候,(如在我厂的系统中,1000行的函数是经常的),要去找出之前写的每一个new然后写对应的delete,这是极不美观且易漏掉的,因此使用自己的内存管理方案是很有好处的:

       1.程序员可以尽情地new,不用负责释放

       2.使用内存池一次性申请一大段连续的内存,之后都在这一段内存上工作,减少内存碎片和系统调用次数

       3.程序运行过程中发生的缺页次数应该会少一些

       首先,定义Buffer类:

       

using namespace std;class Buffer{private:char* head; //buffer的起点char* current; //当前分配位置public:Buffer(size_t totalsize){head = new char[totalsize]; current = head;}void* get(size_t size){char* temp = current;current += size;return temp;}void printSize(){cout<<current-head<<endl;}~Buffer(){delete head;}};
      首先需要重载new输入符,size_t参数是系统自动传进去的,只需把申请的buffer指针传入即可。在函数开始时,可以粗略估算一下大约需要多大的空间,构造差不多大的buffer就可以了,函数结束后Buffer的析构被调用,整个buffer释放的内存一起被释放掉了:

    

void run(){Buffer buffer(4096) ; //4KB的bufferBuffer* pBuffer = &buffer;int* arr = new (pBuffer) int[10]; //调用重载操作符double* arr2 = new (pBuffer) double[10];A* a = new (pBuffer)A();buffer.printSize();}void* operator new[] (size_t size, Buffer* buffer) //重载new[]操作符{return buffer->get(size);}void* operator new (size_t size, Buffer* buffer) //重载new操作符{return buffer->get(size);}

      

原创粉丝点击