MemoryPool的简单实现(内存池)
2015-06-27 20:28
423 查看
这是可以时常切换的MemoryPool
#ifndef MEMORY_POOL #define MEMORY_POOL template<typename Ty> class GD_MemoryPool { public: enum{m_nBlock = 32}; GD_MemoryPool(size_t nBlock = m_nBlock) { m_Expand(nBlock); } ~GD_MemoryPool() { if(pListMemoryPool != null) { GD_MemoryPool<Ty>* pList = pListMemoryPool; while(pListMemoryPool) { pList = pListMemoryPool->pListMemoryPool; delete []static_cast<byte*>(pList); pListMemoryPool = pList; } } }
void m_FreeMemory(void* pBlock) { if(pBlock != null) { GD_MemoryPool<Ty>* pRelease = static_cast<GD_MemoryPool<Ty>*>(pBlock); pRelease->pListMemoryPool = pListMemoryPool; pListMemoryPool = pRelease; } }
void* m_Allocator() { GD_MemoryPool<Ty>* pList = nullptr; if(pListMemoryPool == null) { pList = m_Expand(m_nBlock); } pList = pListMemoryPool->pListMemoryPool; return pList; }
void* m_Allocator() { GD_MemoryPool<Ty>* pList = nullptr; if(pListMemoryPool == null) { pList = m_Expand(m_nBlock); } pList = pListMemoryPool->pListMemoryPool; return pList; }
protected: void* m_Expand(size_t nCount) { //size_t MaxByte to get sizeof(Ty) size_t maxByte = sizeof(GD_MemoryPool<Ty*>); GD_MemoryPool<Ty>* pPreList = static_cast<GD_MemoryPool<Ty>*>(static_cast<void*>(byte[maxByte])); pListMemoryPool = pPreList; GD_MemoryPool<Ty>* pPostList = nullptr; for(size_t i = 0;i < nCount; ++i) { pPostList = static_cast<GD_MemoryPool<Ty>*>(static_cast<void*>(byte[maxByte])); pPreList->PListMemoryPool = pPostList; pPreList = pPostList; } } private:GD_MemoryPool<Ty>* pListMemoryPool; };
原理是:利用一个List把所有的Memory链接在一起;然后如果释放完一个Memory把它放在头结点的位置,然后每次去Memory都从头结点取;
的一个内存池就可以循环使用;
希望各位批评指正,我的程序是存在在单线程;然后但是还是没有特别好的管理内存
相关文章推荐
- Visual Studio跨平台开发(1):Hello Xamarin!
- mysql 查询开销
- Struts框架之手工编写代码方式实现校验
- openlayers3 在地图上叠加WFS查询矢量图层
- mysql 循环控制
- linux 环境变量设置方法总结(PATH/LD_LIBRARY_PATH)
- 排序算法之快速排序
- 黑马程序员--Java学习日记之集合(collection类与list接口)及泛型概述
- JavaScript Date对象
- 不能再docker容器中使用宿主机的docker服务的解决方案
- struct的初始化
- Android Volley完全解析(二),使用Volley加载网络图片
- Spring2集成iBatis2
- servlet基本概念
- Android Studio Mac版快捷键
- DataTables在回调方法中使用api
- 程序员神器
- u-boot配置文件mkconfig分析
- cocos2dx3.6 实现带光标的输入框
- DataTables获取表单输入框数据