内存池实现有许多种,各有不同的优缺点。
这里不是主要说内存池,只是觉得这个内存池中的指针用得很飘逸!
- template <class T,int AllocSize = 50>
- class MemPool
- {
- public:
- static void* operator new(size_t allocLength)
- {
- if(!mStartPotinter)
- {
- MyAlloc();
- }
- //将当前指向空闲内存起始地址作为反回地址
- unsigned char* p = mStartPotinter;
- //取出空闲区域前4字节的值,赋值给空闲地址
- //因为前四字节中存放了下一个BLOCK的地址
- mStartPotinter = *(unsigned char**)mStartPotinter;
- return p;
- }
- static void operator delete(void* deleteP)
- {
- // assert(deletePointer);
- *(unsigned char**)deleteP = mStartPotinter;
- mStartPotinter = (unsigned char*)deleteP;
- }
- static void MyAlloc()
- {
- //预分配内存
- mStartPotinter = new unsigned char[sizeof(T)*AllocSize];
- //构造BLOCK之间的关系
- //每个BLOCK的前4BYTE存放了下一个BLOCK的地址
- unsigned char** next = (unsigned char**)mStartPotinter;
- unsigned char* p = mStartPotinter;
- for(int i = 0; i< AllocSize;++i)
- {
- p +=sizeof(T);//步进
- *next = p;//赋值
- next = (unsigned char**)p;//步进
- }
- *next = NULL;
- }
- static unsigned char* mStartPotinter;
- };
- template <class T,int AllocSize>
- unsigned char* MemPool<T,AllocSize>::mStartPotinter = NULL;
简单提示一下: unsigned char** next = (unsigned char**)mStartPotinter;
mStartPotinter作为二维指针的时候,相当于是一系列的unsigned char* [].
对于第一个 *next 相当于(unsigned char*)mStartPointer[0].
第二个相当于(unsigned char*)mStartPointer[sizeof(T)*1];
第三个相当于(unsigned char*)mStartPointer[sizeof(T)*2];
所以,构造BLOCK之间关系的时候,也可以写成
- for(int i = 0; i< AllocSize;++i)
- {
- p +=sizeof(T);//步进
- unsigned char* pp = (unsigned char*)(p[sizeof(T)*i]);
- pp = p;//赋值
- }
不想多解释了,累。估计多看几分种啥都明白了!
作者:码瘾少年·麒麟子
出处:http://www.cnblogs.com/geniusalex/
蛮牛专栏:麒麟子
简介:09年入行,喜欢游戏和编程,对3D游戏和引擎尤其感兴趣。
版权声明:本文版权归作者和博客园共有,欢迎转载。转载必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
转载:http://www.cnblogs.com/geniusalex/archive/2010/05/03/1940499.html
时间: 2024-12-03 10:54:17