设为首页 加入收藏

TOP

C++内存池实现(二)
2015-02-04 13:53:00 来源: 作者: 【 】 浏览:84
Tags:内存 实现
em-sizeof(BlockHeader));?
? ? ? ? ? ? pBlock->header.pChunk->free(pBlock);?
? ? ? ? }?
? ? ? ? void free(MemoryBlock* pBlock)?
? ? ? ? {?
? ? ? ? ? ? LOCK(hMutex);?
? ? ? ? ? ? pBlock->data.pNext=pFreeList;?
? ? ? ? ? ? pFreeList=pBlock;?
? ? ? ? ? ? UNLOCK(hMutex);?
? ? ? ? }?
? ? ? ? ?
? ? ? ? MemoryChunk* Next(){return pNext;}?
? ? ?
? ? protected:?
? ? ? ? MemoryBlock* CreateBlock()?
? ? ? ? {?
? ? ? ? ? ? MemoryBlock* pBlock=(MemoryBlock*)::malloc(sizeof(BlockHeader)+size);?
? ? ?
? ? ? ? ? ? if(pBlock){?
? ? ?
? ? ? ? ? ? ? ? pBlock->header.pChunk=this;?
? ? ? ? ? ? ? ? pBlock->header.len=size;?
? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ++count;?
? ? ? ? ? ? }?
? ? ? ? ? ? return pBlock;?
? ? ? ? }?
? ? ? ? void DeleteBlock(MemoryBlock* pBlock)?
? ? ? ? {?
? ? ? ? ? ? ::free(pBlock);?
? ? ? ? }?
? ? private:?
? ? ? ? MemoryBlock* pFreeList;?
? ? ? ? size_t size;//!Block大小?
? ? ? ? int count;//!Block数目?
? ? ? ? MemoryChunk* pNext;?
? ? ? ? MUTEXTYPE hMutex;?
? ? };?
? ? #endif


StaticMemory.h文件,内存池对象


#ifndef STATIC_MEMORY_H?
? ? #define STATIC_MEMORY_H?
? ? #include "MemoryChunk.h"?
? ? /** @ StaticMemory.h?
? ? * 定义实现内存池?
? ? * 采用固定大小策略进行内存管理与分配?
? ? * 减少因大量小内存分配导致的内存碎片增加?
? ? */?
? ? struct HeapHeader?
? ? {?
? ? ? ? size_t size;?
? ? };?
? ? struct MemoryHeap?
? ? {?
? ? ? ? HeapHeader header;?
? ? ? ? char pBuffer;?
? ? };?
? ? ?
? ? class StaticMemory?
? ? {?
? ? public:?
? ? ? ? typedef enum{MAX_SIZE=1024,MIN_SIZE=sizeof(MemoryChunk*)};?
? ? ? ? StaticMemory()?
? ? ? ? {?
? ? ? ? ? ? chunkcount=0;?
? ? ? ? ? ? for(size_t size=MIN_SIZE; size<=MAX_SIZE; size*=2)++chunkcount;?
? ? ? ? ? ? //pChunkList=(MemoryChunk**)malloc(sizeof(MemoryChunk*)*chunkcount);?
? ? ? ? ? ? pChunkList=new MemoryChunk*[chunkcount];?
? ? ? ? ? ? int index=0;?
? ? ? ? ? ? for(size_t size=MIN_SIZE; size<=MAX_SIZE; size*=2)?
? ? ? ? ? ? {?
? ? ? ? ? ? ? ? pChunkList[index++]=new MemoryChunk(size,1000);?
? ? ? ? ? ? }?
? ? ? ? }?
? ? ? ? ~StaticMemory()?
? ? ? ? {?
? ? ? ? ? ? for(int index=0; index? ? ? ? ? ? {?
? ? ? ? ? ? ? ? delete pChunkList[index];?
? ? ? ? ? ? }?
? ? ? ? ? ? //free(pChunkList);?
? ? ? ? ? ? delete[] pChunkList;?
? ? ? ? }?
? ? ? ? void* Malloc(size_t size)?
? ? ? ? {?
? ? ? ? ? ? if(size>MAX_SIZE){?
? ? ? ? ? ? ? ? return malloc(size);?
? ? ? ? ? ? }?
? ? ? ? ? ? int index=0;?
? ? ? ? ? ? for(size_t tsize=MIN_SIZE; tsize<=MAX_SIZE; tsize*=2){?
? ? ? ? ? ? ? ? if(tsize>=size)break;?
? ? ? ? ? ? ? ? ++index;?
? ? ? ? ? ? }?
? ? ? ? ? ? return pChunkList[index]->malloc();?
? ? ? ? }?
? ? ? ? void Free(void* pMem)?
? ? ? ? {?
? ? ? ? ? ? if(!free(pMem))MemoryChunk::free(pMem);?
? ? ? ? }?
? ? protected:?
? ? ? ? void* malloc(size_t size)?
? ? ? ? {?
? ? ? ? ? ? MemoryHeap* pHeap=(MemoryHeap*)::malloc(sizeof(HeapHeader)+size);?
? ? ? ? ? ? if(pHeap){?
? ? ? ? ? ? ? ? pHeap->header.size=size;?
? ? ? ? ? ? ? ? return &pHeap->pBuffer;?
? ? ? ? ? ? }?
? ? ? ? ? ? return NULL;?
? ? ? ? }?
? ? ? ? bool free(void* pMem)?
? ? ? ? {?
? ? ? ? ? ? MemoryHeap* pHeap=(MemoryHeap*)((char*)pMem-sizeof(HeapHeader));?
? ? ? ? ? ? if(pHeap->header.size>MAX_SIZE){?
? ? ? ? ? ? ? ? ::free(pHeap);?
? ? ? ? ? ? ? ? return true;?
? ? ? ? ? ? }?
? ? ? ? ? ? return false;?
? ? ? ? }?
? ? private:?
? ? ? ? MemoryChunk** pChunkList;?
? ? ? ? int chunkcount;?
? ? };?
? ? #endif


ObejctManager.h文件,用于实现对象的创建与管理,比较简易。


#ifndef OBJECT_MANAGER_H?
#define OBJECT_MANAGER_H?
#include "StaticMemory.h"?
/** @class ObjectManager?
?* 实现利用内存池创建对象?
?* 要求对象具有缺省构造函数?
?*/?
template?
class ObjectManager?
{?
public:?
? ? typedef T ObjectType;?
?
? ? static ObjectType* Create(StaticMemory* pool)?
? ? {?
? ? ? ? void* pobject=pool->Malloc(sizeof(T));?
? ? ? ? new(pobject) ObjectType();?
? ? ? ? return static_cast(pobject);?
? ? }?
? ? static void Delete(StaticMemory* pool, ObjectType* pobject)?
? ? {?
? ? ? ? pobject->~ObjectType();?
? ? ? ? pool->Free(pobject);?
? ? }?
};?
#endif


测试

首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Linux C编程学习:getchar()和get.. 下一篇CSS3制作苹果风格键盘

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: