memory pool(内存池)的模板实现(暂不支持多线程)
2009-10-07 05:57
393 查看
MemoryPool代码:
性能测试代码:
测试结果:
#include <Windows.h> #include <cassert> template <typename T, int ALLOC_BLOCK_SIZE = 50> class MemoryPool { public: MemoryPool(void) { }; virtual ~MemoryPool(void) { }; static VOID* operator new(size_t allocLength) { assert(sizeof(T) >= sizeof(UCHAR*)); assert(sizeof(T) == allocLength); /////没可用的block就重新分配 if(!freePtr) { allocBlock(); } /////分配当前可用块freePtr给申请者,同时freePtr指向下一个可用的block UCHAR* forreturn = freePtr; freePtr = *reinterpret_cast<UCHAR**>(forreturn); return forreturn; }; static VOID operator delete(VOID* deletePtr) { /////deletePtr的下一个可用block指向freePtr,然后freePtr指向deletePtr *reinterpret_cast<UCHAR**>(deletePtr) = freePtr; freePtr = static_cast<UCHAR*>(deletePtr); }; private: /////alloc一定数量的内存block,然后将其串起来作为可用的block链 /////不过串的方式比较特殊,它是通过向每个block的前4(sizeof(UCHAR*))个 /////字节里写入下一个可用block块的起始地址来串起来的。 static void allocBlock() { freePtr = new UCHAR[sizeof(T) * ALLOC_BLOCK_SIZE]; UCHAR** forassign = reinterpret_cast<UCHAR**>(freePtr); UCHAR* curPtr = freePtr; for(int i = 0; i < ALLOC_BLOCK_SIZE - 1; i++) { curPtr += sizeof(T); *forassign = curPtr; forassign = reinterpret_cast<UCHAR**>(curPtr); } *forassign = 0; }; private: static UCHAR* freePtr; }; template <typename T, int ALLOC_BLOCK_SIZE> UCHAR* MemoryPool<T, ALLOC_BLOCK_SIZE>::freePtr = NULL;
性能测试代码:
#include <Windows.h> #include <iostream> #include "MemoryPool.h" #include <time.h> using namespace std; class A : public MemoryPool<A> { private: BYTE a[1024]; BYTE b[1025]; }; class B { private: BYTE a[1024]; BYTE b[1024]; }; int _tmain(int argc, _TCHAR* argv[]) { clock_t start, finish; start = clock(); for(int i= 0; i < 2000000; i++) { A* pa = new A(); delete pa; } finish = clock(); cout<<"use memory pool : elapsed "<<(finish - start)<<"ms"<<endl; start = clock(); for(int i= 0; i < 2000000; i++) { B* pb = new B(); delete pb; } finish = clock(); cout<<"not use : elapsed "<<(finish - start)<<"ms"<<endl; system("pause"); return 0; }
测试结果:
相关文章推荐
- python3+PyQt5实现支持多线程的页面索引器应用程序
- java封装FFmpeg命令,支持原生ffmpeg全部命令,实现FFmpeg多进程处理与多线程输出控制(开启、关闭、查询),rtsp/rtmp推流、拉流
- python3+PyQt5 实现支持多线程的页面索引器应用程序
- 多线程安全的单件模式,模板基类的单件实现
- 使文件下载的自定义连接支持 FlashGet 的断点续传多线程链接下载! C#/ASP.Net 实现
- C++的类模板的问题(实现文件和头文件放在一起), 因为模板不支持分离编译
- C++实现内存池MemoryPool 包含单线程和多线程
- 实现支持断点续传多线程下载的 Http Web 客户端工具类()
- .Net/C#: 实现支持断点续传多线程下载的 Http Web 客户端工具类 (C# DIY HttpWebClient)
- .Net/C#: 实现支持断点续传多线程下载的 Http Web 客户端工具类 (C# DIY HttpWebClient)
- C#实现支持断点续传多线程下载客户端工具类
- 为什么C++编译器不支持模板头文件和实现代码分离的编译
- 为什么C++编译器不支持模板头文件和实现代码分离的编译
- C++模板来实现一个通用的内存池.
- 实现支持断点续传多线程下载的 Http Web 客户端工具类
- 使文件下载的自定义连接支持 FlashGet 的断点续传多线程链接下载! JSP/Servlet 实现!
- 使文件下载的自定义连接支持 FlashGet 的断点续传多线程链接下载! C#/ASP.Net 实现!
- js:模板解析实现2 -- 支持子列表
- 为什么C++编译器不支持模板头文件和实现代码分离的编译
- .Net/C#: 实现支持断点续传多线程下载的 Http Web 客户端工具类 (C# DIY HttpWebClient)