内存池简单实例
来源:互联网 发布:网络剧搞笑男演员 编辑:程序博客网 时间:2024/06/05 15:42
- #include <stdlib.h>
- #include <stdio.h>
- #include <time.h>
- #include <iostream>
- using namespace std;
- class MemPool
- {
- public:
- MemPool();
- ~MemPool();
- void* Alloc();
- void Free(void* p);
-
- private:
- const static int blockSize = 1024;
- const static int itemSize = 16;
-
- struct ItemNode
- {
- ItemNode *next;
- char data[itemSize - sizeof(ItemNode*)];
- };
-
- struct BlockNode
- {
- BlockNode *next;
- ItemNode data[blockSize/itemSize];
- };
-
- ItemNode *freeItemNodeHead;
- BlockNode *memBlockNodeHead;
- };
- MemPool::MemPool():memBlockNodeHead(NULL), freeItemNodeHead(NULL)
- {
- }
- MemPool::~MemPool()
- {
- BlockNode *temp = memBlockNodeHead;
- while(temp)
- {
- memBlockNodeHead = memBlockNodeHead->next;
- delete temp;
- temp = memBlockNodeHead;
- }
- }
- void* MemPool::Alloc()
- {
- if(freeItemNodeHead== NULL)
- {
- BlockNode *tempBlockNode = new BlockNode;
- if(tempBlockNode== NULL)
- {
- perror("allocate memory error!\n");
- exit(1);
- }
-
- if(memBlockNodeHead== NULL)
- {
- memBlockNodeHead = tempBlockNode;
- memBlockNodeHead->next= NULL;
- }
- else
- {
- tempBlockNode->next= memBlockNodeHead;
- memBlockNodeHead = tempBlockNode;
- }
-
- freeItemNodeHead = &(memBlockNodeHead->data[0]);
-
- int i = 0;
- while(i< blockSize/itemSize-1)
- {
- tempBlockNode->data[i].next= &(tempBlockNode->data[i+1]);
- ++i;
- }
-
- tempBlockNode->data[i].next= NULL;
- }
-
- ItemNode *allocItemNode = freeItemNodeHead;
- freeItemNodeHead = freeItemNodeHead->next;
-
- return allocItemNode;
- }
- void MemPool::Free(void* p)
- {
- ItemNode *tempItemNode = static_cast<ItemNode*>(p);
- tempItemNode->next= freeItemNodeHead;
- freeItemNodeHead = tempItemNode;
- }
- int main()
- {
- MemPool pool;
- char *p =NULL;
-
- clock_t start, finish;
-
- double duration;
-
- long i = 0;
-
- start = clock();
-
- while(i< 10000000)
- {
- p = static_cast<char*>(pool.Alloc());
- //p= new char[16];
- ++i;
- pool.Free(p);
- //delete p;
- }
-
- finish = clock();
-
- duration = (double)(finish- start)/CLOCKS_PER_SEC;
-
- cout <<"total use " << duration<< " seconds" << endl;
-
- system("pause");
-
- return 0;
- }
使用内存池的结果是:
total use 0.245 seconds
使用new,delete操作的结果是:
total use 7.256 seconds
结果相差近30倍,可见使用内存池对系统的性能有很大的提高
MemPool实现源码参见:http://blog.csdn.net/zhangzhenghe/article/details/5437487
- 内存池简单实例
- 简单内存池实例(C++版)
- JAVA内存异常简单实例
- win32共享内存简单实例
- 简单的内存溢出破解实例
- 简单线程池-实例
- 简单内存池
- 新简单内存池
- 简单的内存池
- 简单内存池实现
- 进程间通信系列 之 共享内存简单实例
- 进程与内存2-内核线程应用(简单实例)
- C中内存堆栈的布局---linux 简单实例
- 基于互斥锁同步机制的Linux共享内存简单实例
- System V 中内存共享的简单实例
- POSIX中内存共享(open)的简单实例
- POSIX中内存共享(shm_open)的简单实例
- 数据池使用简单实例
- Triangle
- ZooKeeper典型应用场景一览
- linux下sniffer程序的实现
- flex Alert
- preg_match_all中第四个参数PREG_PATTERN_ORDER,PREG_SET_ORDER,PREG_OFFSET_CAPTURE之间的区别
- 内存池简单实例
- 第1章 C语言概述
- 我开始了黑马之路
- varchar2 nvarchar2 存储中文及所占字节的问题
- REMOTE_ADDR,HTTP_CLIENT_IP,HTTP_X_FORWARDED_FOR 获取用户IP
- Android 中的 Service 全面总结
- maven管理项目
- 从user用户切换到root用户
- sharepoint国内网站一览表(转发)