(3)单线程内存池--可变大小的内存管理器
来源:互联网 发布:js阻止a标签跳转 编辑:程序博客网 时间:2024/04/30 12:38
#include <iostream>
#include <stdlib.h>
using std::cout;
using std::endl;
可变大小的内存空间列表
class MemoryChunk
{
public:
MemoryChunk(MemoryChunk *nextChunk, size_t chunkSize);
~MemoryChunk();
inline void *alloc(size_t size);
inline void free(void *doomed);
MemoryChunk *nextMemChunk() { return next; }
size_t spaceAvailable() {return (chunkSize-bytesAlreadyAllocated); }
enum { DEFAULT_CHUNK_SIZE = 4096 };
private:
MemoryChunk *next;
void *mem;
size_t chunkSize;
size_t bytesAlreadyAllocated;
};
MemoryChunk::MemoryChunk(MemoryChunk *nextChunk, size_t reqSize)
{
chunkSize = reqSize > DEFAULT_CHUNK_SIZE ? reqSize :
DEFAULT_CHUNK_SIZE;
next = nextChunk;
bytesAlreadyAllocated = 0;
mem = new char[chunkSize];
}
MemoryChunk::~MemoryChunk()
{
delete []mem;
}
void * MemoryChunk::alloc(size_t reqSize)
{
void *addr = static_cast<void *>(mem+bytesAlreadyAllocated);
bytesAlreadyAllocated += reqSize;
return addr;
}
void MemoryChunk::free(void *doomed)
{
}
//MemoryChunk 只是一个辅助类, ByteMemoryPool 类用它来实现可变大小的内存管理
class ByteMemoryPool
{
public:
ByteMemoryPool(size_t initSize = MemoryChunk::DEFAULT_CHUNK_SIZE);
~ByteMemoryPool();
inline void *alloc(size_t size);
inline void free(void *doomed);
private:
MemoryChunk *listOfMemoryChunks;
void expandStorage(size_t reqSize);
};
ByteMemoryPool::ByteMemoryPool(size_t size)
{
expandStorage(size);
}
ByteMemoryPool::~ByteMemoryPool()
{
MemoryChunk *memChunk = listOfMemoryChunks;
while (NULL != memChunk)
{
listOfMemoryChunks = memChunk->nextMemChunk();
delete memChunk;
memChunk = listOfMemoryChunks;
}
}
inline void * ByteMemoryPool::alloc(size_t reqSize)
{
size_t size = listOfMemoryChunks->spaceAvailable();
if (size < reqSize)
expandStorage(reqSize);
return listOfMemoryChunks->alloc(reqSize);
}
inline void ByteMemoryPool::free(void *doomed)
{
listOfMemoryChunks->free(doomed);
}
void ByteMemoryPool::expandStorage(size_t reqSize)
{
listOfMemoryChunks = new MemoryChunk(listOfMemoryChunks, reqSize);
}
class Rational
{
public:
Rational(int a = 0, int b = 1) : n(a), d(b) { }
void *operator new(size_t size) { return memPool->alloc(size); }
void operator delete(void *doomed) { return memPool->free(doomed); }
static void newMemPool() { memPool = new ByteMemoryPool; }
static void deleteMemPool() { delete memPool; }
private:
int n;
int d;
static ByteMemoryPool *memPool;
};
ByteMemoryPool * Rational::memPool = NULL;
int main()
{
Rational *arr[1000] = { NULL };
Rational::newMemPool();
for (int k = 0; k < 500; ++k)
{
for (int i = 0; i < 1000; ++i)
arr[i] = new Rational(i);
for (int j = 0; j < 1000; ++j)
delete arr[j];
}
Rational::deleteMemPool();
return 0;
}
- (3)单线程内存池--可变大小的内存管理器
- c++单线程可变大小内存管理器代码 from 提高c++性能的编程技术
- 单线程环境中对象大小可变的内存池
- (1)单线程内存池---专用Rational内存管理器
- 单线程固定大小对象的内存池实现
- 单线程不固定大小对象的内存池实现
- 单线程环境中对象大小固定的内存池
- 对象大小固定的单线程内存池设计
- (2)单线程内存池--固定大小对象的内存池
- 单线程内存池
- 单线程内存池
- c++单线程内存池
- efficient c++,单线程内存池
- c 单线程内存池实现
- 文件系统、缓存管理器、内存管理器的关系
- 文件系统、缓存管理器、内存管理器的关系
- 内存管理器
- 内存管理器
- 移植QT4.7.1到arm-linux设备上
- EclipsePlug-in使用TextEditor开发自己的编辑器,实现关键字高亮和代码提示.
- JS设定输入框只能输入数字,小数和字母等的正则表达式
- sql语句的join用法
- 上市公司蜂拥网络彩票市场
- (3)单线程内存池--可变大小的内存管理器
- 多情的人
- Maven学习 (一) 搭建Maven环境
- Servlet详解---Servlet与表单
- linux下android开发环境搭建及NDK安装
- 如何找java.library.path
- web.xml
- Maven学习 (二) Eclipse 上安装 Maven3插件
- NFV,重构网络功能的开放架构