C++如何简单的实现内存池
2016-11-28 14:23
375 查看
假如遇到频繁申请释放、频繁释放内存的情况,即使一次申请的内存很少,释放的也很及时,但是我们知道操作系统分配内存并不是连续的,如果频繁申请会在内存中产生许多碎片,因此在程序运行比较长的时间后,占用的内存就会非常大,甚至导致内存不足崩溃。解决办法就是内存池,思想是提前分配一片比较大的连续内存,分配的时候从这片连续内存申请,析构的时候也不释放内存,而是把内存还给内存池。当然内存池也可以扩展,如果内存不足的时候再申请一片更大的内存,有点类似vector的实现,只不过不移位了。boost有memory pool可以实现,单本文介绍的是一种更简洁的实现方式,是通过重载new操作符实现的。代码如下:
#include <stdexcept>
using namespace std;
template <class T>
class CacheObj
{
public:
void *operator new(std::size_t sz)
{
if(sz != sizeof(T))
throw std::runtime_error("CacheObj: wrong size object in operator new");
if(!freeStore)
{
T* array = alloc_mem.allocate(chunk);
for (size_t i = 0; i != chunk; i++)
add_to_freelist(&array[i]);
}
T* p = freeStore;
freeStore = freeStore->CacheObj<T>::next;
return p;
}
void operator delete(void* p, std::size_t)
{
if(p != 0)
add_to_freelist(static_cast<T*>(p));
}
virtual ~CacheObj(){}
protected:
T* next;
private:
static void add_to_freelist(T* p)
{
p->CacheObj<T>::next = freeStore;
freeStore = p;
}
static std::allocator<T> alloc_mem;
static T* freeStore;
static const std::size_t chunk;
};
template<class T> allocator<T> CacheObj<T>::alloc_mem;
template<class T> T* CacheObj<T>::freeStore = 0;
template<class T> const size_t CacheObj<T>::chunk = 124;
#include <stdexcept>
using namespace std;
template <class T>
class CacheObj
{
public:
void *operator new(std::size_t sz)
{
if(sz != sizeof(T))
throw std::runtime_error("CacheObj: wrong size object in operator new");
if(!freeStore)
{
T* array = alloc_mem.allocate(chunk);
for (size_t i = 0; i != chunk; i++)
add_to_freelist(&array[i]);
}
T* p = freeStore;
freeStore = freeStore->CacheObj<T>::next;
return p;
}
void operator delete(void* p, std::size_t)
{
if(p != 0)
add_to_freelist(static_cast<T*>(p));
}
virtual ~CacheObj(){}
protected:
T* next;
private:
static void add_to_freelist(T* p)
{
p->CacheObj<T>::next = freeStore;
freeStore = p;
}
static std::allocator<T> alloc_mem;
static T* freeStore;
static const std::size_t chunk;
};
template<class T> allocator<T> CacheObj<T>::alloc_mem;
template<class T> T* CacheObj<T>::freeStore = 0;
template<class T> const size_t CacheObj<T>::chunk = 124;
相关文章推荐
- Windows Phone 8 学习志(探索问题一:如何简单利用Windows Phone Runtime Component项目类型实现C#和C++交互)
- C++实现简单的内存池
- C++的杂七杂八:如何实现一个简单的bind
- C++简单内存池的实现
- C++简单实现GC和内存池
- C++简单实现一个内存池的分配
- C++多态是如何实现的——一个简单明晰的例子告诉你!
- C++如何实现简单的计时器详解
- C++实现简单的内存池
- 基于VS C++平台的OpenCV设置,实现简单的行人检测
- Linux C++ 实现简单的广播服务
- 基于ros---一个完整的实现topic 发布和监听的类和msg的简单使用(使用c++)
- c/c++ 使用boost库实现的一个简单判断字符串编码的方法
- 八大排序简单小结及c++实现
- 基于C++实现简单的BP神经网络算法
- C++对象动态生成(Dynamic Create)的简单实现
- 一致性hash的c++简单实现
- C++如何实现启动一个进程并把该进程的标题改为我的标题
- 程序员面试金典: 9.13 C和C++ 13.2 比较并比对散列表和STL map。散列表是如何实现的?如果输入的数据量不大,可以选用哪些数据结构替代散列表?