某内存池中的指针用法

简介:

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

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

  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

目录
相关文章
|
24天前
|
存储 C语言 C++
动态内存分配与指向它的指针变量
动态内存分配与指向它的指针变量
20 1
|
4月前
|
存储 C语言 索引
【c语言指针详解】复杂数据结构的指针用法
【c语言指针详解】复杂数据结构的指针用法
76 0
|
4月前
|
存储 C语言
【c语言指针详解】指针的基本概念和用法
【c语言指针详解】指针的基本概念和用法
63 0
|
3月前
|
存储 API
五十行代码教你写一个简单的内存池(二级指针的应用)
五十行代码教你写一个简单的内存池(二级指针的应用)
18 0
|
5月前
|
存储 编译器 C语言
深入理解C++内存管理:指针、引用和内存分配(下)
深入理解C++内存管理:指针、引用和内存分配
|
6月前
|
C语言
通过模拟实现计算器介绍函数指针数组和回调函数的用法【C语言/指针/进阶】
通过模拟实现计算器介绍函数指针数组和回调函数的用法【C语言/指针/进阶】
43 0
|
6月前
|
存储 搜索推荐 Serverless
用指针和动态内存分配的方法输入10,2,30, 4,5,按输入顺序逆置排序,输出排序后的元素,即输出5,4,30,2,10
用指针和动态内存分配的方法输入10,2,30, 4,5,按输入顺序逆置排序,输出排序后的元素,即输出5,4,30,2,10
29 0
|
29天前
|
存储 安全 程序员
【C++ 包装器类 智能指针】完全教程:std::unique_ptr、std::shared_ptr、std::weak_ptr的用法解析与优化 — 初学者至进阶指南
【C++ 包装器类 智能指针】完全教程:std::unique_ptr、std::shared_ptr、std::weak_ptr的用法解析与优化 — 初学者至进阶指南
66 0
|
1月前
|
存储 安全 编译器
C++智能指针:更简单、更高效的内存管理方法
C++智能指针:更简单、更高效的内存管理方法
12 0
|
1月前
|
算法 Java
快慢指针该如何操作?本文带你认识快慢指针常见的三种用法及在链表中的实战
快慢指针该如何操作?本文带你认识快慢指针常见的三种用法及在链表中的实战
19 0