(此文由nunix@sohu.com原创,转载请注明出处)
在频繁的堆内存操作时,为提高效率,需要自定义动态内存分配与销毁动作。该模块是对系统管理内存的封装,一般称为内存池(Memory Pool)模块。
下文提到的简单内存池结构是笔者经常使用的技术,比之复杂的内存池结构具有简单、省空间、高效的特点,当然由于简单,可能不具有通用性,大家可以再次基础上扩展自定义适合自己项目的内存池模块。
- union MemUnit;
- #define INITSIZE 10
- class CTest
- {
- public:
- static MemUnit* lpMemFirst;
- void* operator new(size_t); //自定义CTest的分配动作
- void operator delete(void*); //自定义CTest的销毁动作
- };
- union MemUnit //内存池结构
- {
- char data[sizeof(CTest)];
- MemUnit *next;
- };
- MemUnit* CTest::lpMemFirst=NULL;
- void* CTest::operator new(size_t size)
- {
- if( lpMemFirst==NULL ) //如果没有可用内存
- {
- MemUnit *p=new MemUnit[INITSIZE];
- //将从系统获得的内存初始化为链表结构
- for(int i=0;i<INITSIZE-1;i++)
- p[i].next=p+i+1;
- p[INITSIZE-1].next=NULL;
- lpMemFirst=p;
- }
- MemUnit* p=lpMemFirst;
- lpMemFirst=p->next;
- return p->data;
- }
- void CTest::operator delete(void *p)
- {
- ((MemUnit*)p)->next=lpMemFirst;
- lpMemFirst=(MemUnit*)p;
- }
这个模块没有多线程安全处理,希望大家可以加入其他扩展功能,共同来完善之。