某内存池中的指针用法

简介:

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

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

  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

目录
相关文章
|
存储 Java C++
C++ 引用和指针:内存地址、创建方法及应用解析
C++中的引用是现有变量的别名,创建时需用`&`运算符,如`string &meal = food;`。指针存储变量的内存地址,使用`*`创建,如`string* ptr = &food;`。引用必须初始化且不可为空,而指针可初始化为空。引用在函数参数传递和提高效率时有用,指针适用于动态内存分配和复杂数据结构操作。选择使用取决于具体需求。
550 9
10分钟让你学会内存函数:memcpy,memmove,memset,memcmp的用法及模拟实现。
10分钟让你学会内存函数:memcpy,memmove,memset,memcmp的用法及模拟实现。
766 2
|
存储 C语言 计算机视觉
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。
1025 4
|
容器
在使用指针数组进行动态内存分配时,如何避免内存泄漏
在使用指针数组进行动态内存分配时,避免内存泄漏的关键在于确保每个分配的内存块都能被正确释放。具体做法包括:1. 分配后立即检查是否成功;2. 使用完成后及时释放内存;3. 避免重复释放同一内存地址;4. 尽量使用智能指针或容器类管理内存。
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
994 4
|
存储 Rust C#
内存指针解引用
【10月更文挑战第14天】
525 1
|
C++
析构造函数就是为了释放内存,就是在局部指针消失前释放内存,拷贝构造函数就是以构造函数为模块,在堆里面新开一块,同一个变量在堆里面的地址
本文讨论了C++中构造函数和析构函数的作用,特别是它们在管理动态内存分配和释放中的重要性,以及如何正确地实现拷贝构造函数以避免内存泄漏。
325 2
|
存储 安全 Go
Go 中的指针:了解内存引用
Go 中的指针:了解内存引用
|
运维
开发与运维数组问题之指针的加减法意义如何解决
开发与运维数组问题之指针的加减法意义如何解决
272 7
|
存储
指针用法及分类
指针用法及分类
412 7