目录:
1.C语言内存池
2.c语言的内存池的设计与实现
3.c++内存池的设计和实现
4.c# 内存池
5.C++ 实现高性能内存池
6.c++内存池
7.c语言进程池
8.c语言实现线程池
9.内存池的实现原理
10.c语言内存池的实现原理
1.C语言内存池
内存池是自己向OS请求的一大块内存,自己进行管理##系统调用## 我们先测试系统调用new/delete的用时#include #include using namespace std; class TestClass { private: char m_chBuf[4096]; }; timespec diff(timespec start, timespec end) { timespec temp; temp.tv_sec = end.tv_sec-start.tv_sec; temp.tv_nsec = end.tv_nsec-start.tv_nsec; return temp; } int main() { timespec time1, time2; clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time1); for(unsigned int i=0; i< 0x5fffff; i++) { TestClass *p = new TestClass; delete p; } clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time2); cout<
2.c语言的内存池的设计与实现
用时为604124400ns系统的new是在堆上分配资源,每次执行都会分配然后销毁##简单的内存池###include #include using namespace std; char buf[4100]; //已分配内存 class TestClass { public: void* operator new(size_t) {return (void*)buf;} void operator delete(void* p){} private: char m_chBuf[4096]; }; int main() { timespec time1, time2; clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time1); for(unsigned int i=0; i< 0x5fffff; i++) { TestClass *p = new TestClass; delete p; } clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time2); cout<< diff(time1,time2).tv_sec<<“:”<
3.c++内存池的设计和实现
用时为39420791ns,后者比前者快20倍简单内存池在开始在全局/静态存储区分配资源,一直存在每次重载的new调用只是返回了buf的地址,所以快##MemPool定义##class CMemPool { private: struct _Unit { struct _Unit *pPrev, *pNext; }; void* m_pMemBlock; struct _Unit* m_pFreeMemBlock; struct _Unit* m_pAllocatedMemBlock; unsigned long m_ulUnitSize; //一个单元的内存大小 unsigned long m_ulBlockSize; //整个内存池的内存大小 public: CMemPool(unsigned long lUnitNum = 50, unsigned long lUnitSize = 1024); ~CMemPool(); void* Alloc(unsigned long ulSize, bool bUseMemPool = true); void Free(void* p); }; 。
4.c# 内存池
CMemPool定义了一个_Unit来管理链表,指针被包含在整个结构中,这种方式和内核中的链表写法很像m_pMemBlock指向分配的那块大小为m_ulBlockSize的大内存的地址m_pMemBlock是线性的内存,我们把它用下列这种方式管理。
5.C++ 实现高性能内存池
它被均分为lUnitNum个大小为m_ulUnitSize Byte的小内存块每个块分为2部分:Unit链表管理头,真正进行存储的内存单元从图中可以看出m_ulBlockSize的计算方式为:UnitNum * ( UnitSize + sizeof(Struct _Unit)) 。
6.c++内存池
然后用双向链表连接所有的小块m_pFreeMemBlock指向空闲的内存的起始位置,m_pAllocatedMemBlock指向已分配出去的内存的起始位置##MemPool实现##CMemPool::CMemPool(unsigned long ulUnitNum, unsigned long ulUnitSize): m_pMemBlock(NULL), m_pAllocatedMemBlock(NULL), m_pFreeMemBlock(NULL), m_ulBlockSize(ulUnitNum * (ulUnitSize+sizeof(struct _Unit))), m_ulUnitSize(ulUnitSize) { m_pMemBlock = malloc(m_ulBlockSize); if(NULL != m_pMemBlock) { for(unsigned long i = 0; ipPrev = NULL; pCurUnit->pNext = m_pFreeMemBlock; if(NULL != m_pFreeMemBlock) { m_pFreeMemBlock->pPrev = pCurUnit; } m_pFreeMemBlock = pCurUnit; } } } 。
7.c语言进程池
构造函数设置默认的小块数为50,每个小快大小为1024,最后用双向链表管理它们,m_pFreeMemBlock指向开始void* CMemPool::Alloc(unsigned long ulSize, bool bUseMemPool) { if(ulSize > m_ulUnitSize || false == bUseMemPool || NULL == m_pMemBlock || NULL == m_pFreeMemBlock) { cout << “System Call” pPrev = NULL; } pCurUnit->pNext = m_pAllocatedMemBlock; if(NULL != m_pAllocatedMemBlock) { m_pAllocatedMemBlock->pPrev = pCurUnit; } m_pAllocatedMemBlock = pCurUnit; cout << “Memory Pool” << endl; return (void*)((char*)pCurUnit + sizeof(struct _Unit)); } 。
8.c语言实现线程池
Alloc的作用是分配内存,返回分配的内存地址,注意加上Unit的大小是为了略过Unit管理头实质是把m_pFreeMemBlock指向的free内存移动到m_pAllocatedMemBlock指向的已分配内存里。
9.内存池的实现原理
每次分配时,m_pFreeMemBlock指针后移pCurUnit从前面插入到m_pAllocatedMemBlock里void CMemPool::Free(void* p) { if(m_pMemBlock
10.c语言内存池的实现原理
Free的作用是释放内存,实质是把m_pAllocatedMemBlock指向的已分配内存移动到m_pFreeMemBlock指向的free内存里和Alloc的作用相反pCurUnit要减去struct _Unit是为了从存储单元得到管理头的位置,堆是向上生长的。
##测试###include “mempool.h” #include CMemPool g_MemPool; class CTestClass { public: void *operator new(size_t); //重载运算符new void operator delete(void *p); private: char m_chBuf[1000]; }; void *CTestClass::operator new(size_t uiSize) { return g_MemPool.Alloc(uiSize); //分配g_MemPool的内存给它 } void CTestClass::operator delete(void *p) { g_MemPool.Free(p); } class CTestClass2 { private: char m_chBuf[1000]; }; timespec diff(timespec start, timespec end) { timespec temp; temp.tv_sec = end.tv_sec-start.tv_sec; temp.tv_nsec = end.tv_nsec-start.tv_nsec; return temp; } int main() { timespec time1, time2; for(int iTestCnt=1; iTestCnt<=10; iTestCnt++) { unsigned int i; //使用内存池测试 clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time1); for(i=0; i<100000*iTestCnt; i++) { CTestClass *p = new CTestClass; delete p; } clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time2); cout << “[ Repeat ” << 100000*iTestCnt << ” Times ]” << “Memory Pool Interval = ” << diff(time1,time2).tv_nsec << “ns” << endl; //使用系统调用测试 clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time1); for(i=0; i
##结果##从下图可以看出,只有当程序频繁地用系统调用malloc/free或者new/delete分配内存时,内存池有价值。
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
8. 精力有限,不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别
丞旭猿论坛
暂无评论内容