某内存池中的指针用法

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

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

  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

时间: 2024-12-03 10:54:17

某内存池中的指针用法的相关文章

C++中的指针用法大搜罗

  在C++中,指针用得比较多,对于里面众多的指针用法,不免弄得有些糊涂,自从我从图书馆里借到一本谭浩强教授主编的<C++面向对象程序设计>后,才帮我理清了思路.现把部分内容展现给大家,希望对大家有所帮助. C++程序设计重要基础就是类和对象,对象指针是很重要的一部分,包括指向对象的指针.指向对象成员的指针.this指针.指向对象的常指针.指向常对象的指针等. 1.指向对象的指针 定义:对象空间的起始地址就是对象的指针. 说明:在建立对象时,编译系统就为每个对象分配一定的存储空间以存放其成员,

C++中的指针用法汇总

在C++中,指针用得比较多,对于里面众多的指针用法,不免弄得有些糊涂,自从我从图书馆里借到一本谭浩强教授主编的<C++面向对象程序设计>后,才帮我理清了思路.现把部分内容展现给大家,希望对大家有所帮助. C++程序设计重要基础就是类和对象,对象指针是很重要的一部分,包括指向对象的指针.指向对象成员的指针.this指针.指向对象的常指针.指向常对象的指针等. 1.指向对象的指针 定义:对象空间的起始地址就是对象的指针. 说明:在建立对象时,编译系统就为每个对象分配一定的存储空间以存放其成员,不过

释放指针对象内存-QList中的指针成员无法释放内存,大家是怎么做的?

问题描述 QList中的指针成员无法释放内存,大家是怎么做的? QThread * thread = new QThread(); QList * list = new QList(); list->append(thread); 然后遍历QList中的线程,当某个线程运行完后释放内存 delete list->takeAt(i); 但发现程序运行很久后占用的内存在增大,是不是delete list->takeAt(i);没有释放掉内存 解决方案 加一句list->takeAt(i

内存详解: 详解PHP内存池中的存储层

PHP的内存管理器是分层(hierarchical)的.这个管理器共有三层:存储层(storage).堆(heap)层和 emalloc/efree 层.存储层通过 malloc().mmap() 等函数向系统真正的申请内存,并通过free()函数释放所申请的内存.存储层通常申请的内存块都比较大,这里申请的内存大并不是指storage层结构所需要的内存大,只是堆层通过调用存储层的分配方法时,其以段的格式申请的内存比较大,存储层的作用是将内存分配的方式对堆层透明化.首先看storage层的结构:/

基于C语言的内存池的设计与实现

介绍:        设计内存池的目标是为了保证服务器长时间高效的运行,通过对申请空间小而申请频繁的对象进行有效管理,减少内存碎片的产生,合理分配管理用户内存,从而减少系统中出现有效空间足够,而无法分配大块连续内存的情况. 目标:     此次设计内存池的基本目标,需要满足线程安全性(多线程),适量的内存泄露越界检查,运行效率不太低于malloc/free方式,实现对4-128字节范围内的内存空间申请的内存池管理(非单一固定大小对象管理的内存池). 内存池技术设计与实现     本内存池的设计方

内存池

转自http://www.ibm.com/developerworks/cn/linux/l-cn-ppp/index6.html (还没看懂,先Mark一下) 如前所述,读者已经了解到"堆"和"栈"的区别.而在编程实践中,不可避免地要大量用到堆上的内存.例如在程序中维护一个链表的数据结构时,每次新增或者删除一个链表的节点,都需要从内存堆上分配或者释放一定的内存:在维护一个动态数组时,如果动态数组的大小不能满足程序需要时,也要在内存堆上分配新的内存空间. 6.1.1

内存池技术介绍

看到一篇关于内存池技术的介绍文章,受益匪浅,转贴至此.   原贴地址:http://www.ibm.com/developerworks/cn/linux/l-cn-ppp/index6.html  6.1 自定义内存池性能优化的原理   如前所述,读者已经了解到"堆"和"栈"的区别.而在编程实践中,不可避免地要大量用到堆上的内存.例如在程序中维护一个链表的数据结构时,每次新增或者删除一个链表的节点,都需要从内存堆上分配或者释放一定的内存:在维护一个动态数组时,如果

内核内存池管理技术实现分析【转】

转自:http://blog.chinaunix.net/uid-23634108-id-2393485.html 一.Linux系统内核内存管理简介 Linux采用"按需调页"算法,支持三层页式存储管理策略.将每个用户进程4GB长度的虚拟内存划分成固定大小的页面.其中0至3GB是用户态空间,由各进程独占:3GB到4GB是内核态空间,由所有进程共享,但只有内核态进程才能访问. Linux将物理内存也划分成固定大小的页面,由数据结构page管理,有多少页面就有多少page结构,它们又作为

不定长内存池之apr_pool

内存池可有效降低动态申请内存的次数,减少与内核态的交互,提升系统性能,减少内存碎片,增加内存空间使用率,避免内存泄漏的可能性,这么多的优点,没有理由不在系统中使用该技术. 内存池分类: 1.              不定长内存池.典型的实现有apr_pool.obstack.优点是不需要为不同的数据类型创建不同的内存池,缺点是造成分配出的内存不能回收到池中.这是由于这种方案以session为粒度,以业务处理的层次性为设计基础. 2.             定长内存池.典型的实现有LOKI.B