内存池

                   单线程内存池,通过模板技术,可以给单线程池加上不同的锁,以此来实现多线程内存池

                  

#ifndef MEMORYPOOL_H
#define MEMORYPOOL_H

#include <list>

template <typename T>
/**
 * @brief The MemoryPool class 单线程
 */
class MemoryPool
{
public:
    MemoryPool(int _size = DEFAULTSIZE);
    ~MemoryPool();
    void* alloc(size_t _size);
    void free(void* element, size_t size);
    int size() const {
        return _size;
    }
    int vaildSize() const {
        return _validsize;
    }
private:
    enum {DEFAULTSIZE = 100};
    /**
     * @brief pool 用来存放内存块的指针
     */
    std::list<void*> pool;
    void expandPool(int _len = DEFAULTSIZE);
    /**
     * @brief _size 内存池的大小
     */
    int _size;
    /**
     * @brief _validsize 可用内存块
     */
    int _validsize;
};

template <typename T>
MemoryPool<T>::MemoryPool(int _size):
    _size(0),
    _validsize(0)
{
    expandPool(_size);
}
template <typename T>
MemoryPool<T>::~MemoryPool()
{
    std::list<void*>::iterator ite = pool.begin();
    for (;ite != pool.end();++ite) {
        delete[] (*ite);
    }
}
template <typename T>
void* MemoryPool<T>::alloc(size_t /*_size*/)
{
    if (pool.empty()) {
        expandPool();
    }
    void* t = pool.front();
    pool.pop_front();
    --_validsize;
    return t;
}
template <typename T>
void MemoryPool<T>::free(void *element, size_t /*size*/)
{
    pool.push_back(element);
    ++_validsize;
}
template <typename T>
void MemoryPool<T>::expandPool(int _len)
{
    for (int i = 0;i < _len;++i) {
        pool.push_back(static_cast<void*>(new char[sizeof(T)]));
    }
    _validsize += _len;
    _size += _len;
}


#endif // MEMORYPOOL_H


#ifndef MTMEMORYPOOL_H
#define MTMEMORYPOOL_H


/**
 *mp 单线程内存池, locker为锁
 */
template <typename MP, typename Locker>
/**
 * @brief The MTmemoryPool class 多线程
 */
class MTmemoryPool
{
public:
    MTmemoryPool() {}
    ~MTmemoryPool(){}
    void* alloc(size_t size) {
        lock.lock();
        void *r = pool.alloc(size);
        lock.unlock();
        return r;
    }
    void free(void* element, size_t size) {
        lock.lock();
        pool.free(element,size);
        lock.unlock();
    }

    int size() const {
        return pool.size();
    }

private:
    MP pool;
    Locker lock;
};

#endif // MTMEMORYPOOL_H


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值