内存池

王朝百科·作者佚名  2010-07-20
窄屏简体版  字體: |||超大  

基本概念内存池(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;

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航