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);}
- c实现的内存池
- C 内存池的实现
- 内存池的C语言实现
- 常用内存池的实现 mem.c
- 内存池的C语言实现
- c语言实现的内存池
- Linux C内存池的实现
- C 实现内存池
- C语言实现内存池
- C语言实现内存池
- c语言内存池实现
- linux c 实现内存池
- 基于C语言的内存池的设计与实现
- 基于C语言的内存池的设计与实现
- 基于C语言的内存池的设计与实现
- 基于C语言的内存池的设计与实现
- 基于C语言的内存池的设计与实现
- 各种池---内存池的高效实现(C语言)
- InfiniBand 网络
- Xmemcached与Spring 3.0的集成
- GPS数据格式转换
- win7下安装配置apache+php+mysql环境
- Entity Framework 全面教程详解(转)
- C++内存池的极简版实现
- 各种AJAX方法的使用比较(3)
- Asterisk的SIP type和身份认证
- Opencv网站
- 各种AJAX方法的使用比较(4)
- windows+apache+php5.2.x+imagick安装配置
- PHP操作IP地址在mysql中的存储方式
- Android 高级绘图
- hdu 1011 树形背包