某内存池中的指针用法

  1. 云栖社区>
  2. 博客>
  3. 正文

某内存池中的指针用法

shy丶gril 2016-05-19 16:30:52 浏览721
展开阅读全文

内存池实现有许多种,各有不同的优缺点。

这里不是主要说内存池,只是觉得这个内存池中的指针用得很飘逸!

  1. template <class T,int AllocSize = 50>  
  2. class MemPool  
  3. {  
  4. public:  
  5.     static void* operator new(size_t allocLength)  
  6.     {  
  7.         if(!mStartPotinter)  
  8.         {  
  9.             MyAlloc();  
  10.         }  
  11.         //将当前指向空闲内存起始地址作为反回地址  
  12.         unsigned char* p = mStartPotinter;  
  13.         //取出空闲区域前4字节的值,赋值给空闲地址  
  14.         //因为前四字节中存放了下一个BLOCK的地址  
  15.         mStartPotinter = *(unsigned char**)mStartPotinter;  
  16.         return p;  
  17.     }  
  18.   
  19.     static void operator delete(void* deleteP)  
  20.     {  
  21. //      assert(deletePointer);  
  22.         *(unsigned char**)deleteP = mStartPotinter;  
  23.         mStartPotinter = (unsigned char*)deleteP;  
  24.     }  
  25.   
  26.     static void MyAlloc()  
  27.     {  
  28.         //预分配内存  
  29.         mStartPotinter = new unsigned char[sizeof(T)*AllocSize];  
  30.         //构造BLOCK之间的关系   
  31.         //每个BLOCK的前4BYTE存放了下一个BLOCK的地址  
  32.         unsigned char** next = (unsigned char**)mStartPotinter;  
  33.         unsigned char* p = mStartPotinter;  
  34.   
  35.         for(int i = 0; i< AllocSize;++i)  
  36.         {  
  37.             p +=sizeof(T);//步进  
  38.             *next = p;//赋值  
  39.             next = (unsigned char**)p;//步进  
  40.         }  
  41.         *next = NULL;  
  42.     }  
  43.   
  44.     static unsigned char* mStartPotinter;  
  45. };  
  46.   
  47. template <class T,int AllocSize>  
  48. 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之间关系的时候,也可以写成

  1. for(int i = 0; i< AllocSize;++i)  
  2. {  
  3.  p +=sizeof(T);//步进  
  4.  unsigned char* pp = (unsigned char*)(p[sizeof(T)*i]);  
  5.  pp = p;//赋值  
  6. }  

不想多解释了,累。估计多看几分种啥都明白了!

作者:码瘾少年·麒麟子 
出处:http://www.cnblogs.com/geniusalex/ 
蛮牛专栏:麒麟子 
简介:09年入行,喜欢游戏和编程,对3D游戏和引擎尤其感兴趣。 
版权声明:本文版权归作者和博客园共有,欢迎转载。转载必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载:http://www.cnblogs.com/geniusalex/archive/2010/05/03/1940499.html

网友评论

登录后评论
0/500
评论
shy丶gril
+ 关注