通用内存池
来源:互联网 发布:手机淘宝不弹出淘口令 编辑:程序博客网 时间:2024/06/05 02:10
内存池
[编辑本段]基本概念
内存池(Memory Pool)是一种内存分配方式。 通常我们习惯直接使用new、malloc等API申请分配内存,这样做的缺点在于:由于所申请内存块的大小不定,当频繁使用时会造成大量的内存碎片并进而降低性能。 内存池则是在真正使用内存之前,先申请分配一定数量的、大小相等(一般情况下)的内存块留作备用。当有新的内存需求时,就从内存池中分出一部分内存块,若内存块不够再继续申请新的内存。这样做的一个显著优点是尽量避免了内存碎片,使得内存分配效率得到提升。[编辑本段]内存池实现示例
内存池的实现有很多,性能和适用性也不相同,以下是一种较简单的C++实现 -- GenericMP模板类。(本例取材于《Online game server programming》一书) 在这个例子中,使用了模板以适应不同对象的内存需求,内存池中的内存块则是以基于链表的结构进行组织。GenericMP模板类定义
template <class T, int BLOCK_NUM= 50> class GenericMP { public: static VOID *operator new(size_t allocLen) { assert(sizeof(T) == allocLen); if(!m_NewPointer) MyAlloc(); UCHAR *rp = m_NewPointer; m_NewPointer = *reinterpret_cast<UCHAR**>(rp); //由于头4个字节被“强行”解释为指向下一内存块的指针,这里m_NewPointer就指向了下一个内存块,以备下次分配使用。 return rp; } static VOID operator delete(VOID *dp) { *reinterpret_cast<UCHAR**>(dp) = m_NewPointer; m_NewPointer = static_cast<UCHAR*>(dp); } private: static VOID MyAlloc() { m_NewPointer = new UCHAR[sizeof(T) * BLOCK_NUM]; UCHAR **cur = reinterpret_cast<UCHAR**>(m_NewPointer); //强制转型为双指针,这将改变每个内存块头4个字节的含义。 UCHAR *next = m_NewPointer; for(INT i = 0; i < BLOCK_NUM; i++) { next += sizeof(T); *cur = next; cur = reinterpret_cast<UCHAR**>(next); //这样,所分配的每个内存块的头4个字节就被“强行“解释为指向下一个内存块的指针, 即形成了内存块的链表结构。 } *cur = 0; } static UCHAR *m_NewPointer; protected: ~GenericMP() { } }; template<class T, int BLOCK_NUM > UCHAR *GenericMP<T, BLOCK_NUM >::m_NewPointer;GenericMP模板类应用
class ExpMP : public GenericMP<ExpMP> { BYTE a[1024]; }; int _tmain(int argc, _TCHAR* argv[]) { ExpMP *aMP = new ExpMP(); delete aMP; }- 通用内存池
- 通用C++内存池代码
- 通用寄存器-内存读写
- 通用寄存器-内存读写
- C++模板来实现一个通用的内存池.
- genalloc — 通用内存分配器
- genalloc — 通用内存分配器
- genalloc — 通用内存分配器
- genalloc — 通用内存分配器
- genalloc — 通用内存分配器
- genalloc — 通用内存分配器
- C-通用内存交换函数
- 嵌入式(标准C环境下)下通用的内存池的实现---前言
- 嵌入式(标准C环境下)下通用的内存池的实现---头文件
- 嵌入式(标准C环境下)下通用的内存池的实现---C文件
- 嵌入式(标准C环境下)下通用的内存池的实现---后记(使用)
- GC 回收WPF 内存 C#通用
- 操作系统处理内存超载的通用方法
- mfc初学
- deadlocks(死锁)
- 匆忙的毕业之后,兄弟们还好吧?
- CTHreadManager
- tenda w541u 软ap设置,htc g2固定ip地址
- 通用内存池
- 全新S2SH配置一步一步过程详解 转载请注明
- VC进程相关的学习(四)(API截获)
- TMS320x281x和TMS320x2833x/TMS320x2823x之间的区别
- 内存溢出和解决方案!
- js正则基本语法知识
- GLSL中运用整数型易变变量【转】
- HDU 3491 Thieves 【拆点+最大流】
- [转]马步