tars源码漫谈第23篇------tc_buffer_pool.h/tc_buffer_pool.cpp(内存池操作)

      tc_buffer_pool中的TC_Slice是一个内存类, TC_BufferPool是一个内存池类。

      涉及到的都是内存的操作, 申请, 释放等。 封装后, 便于统一使用。

      看了一下, 有些地方有点绕, 但不难理解, 不需要多说。 来随便看几个函数:

TC_Slice TC_BufferPool::Allocate(size_t size)
{
    TC_Slice s;
    size = RoundUp2Power(size);
    if (size == 0)
        return s;

    if (size < _minBlock || size > _maxBlock) 
    {
        // 不归pool管理,直接new
        s.data = new char[size];
        s.len = size;
    }
    else
    {
        // 定位到具体的buffer链表
        BufferList& blist = _GetBufferList(size); 
        s = _Allocate(size, blist);
    }

    return s;
}

void TC_BufferPool::Deallocate(TC_Slice s)
{
    if (s.len < _minBlock || s.len > _maxBlock) 
    {
        // 不归pool管理,直接delete
        delete[] reinterpret_cast<char*>(s.data);
    }
    else if (_totalBytes >= _maxBytes)
    {
        // 占用内存过多,就不还给pool
        delete[] reinterpret_cast<char*>(s.data);
    }
    else
    {
        // 还给pool
        BufferList& blist = _GetBufferList(s.len);
        blist.push_back(s.data);
        _totalBytes += s.len;
    }
}

void TC_BufferPool::SetMaxBytes(size_t bytes)
{
    _maxBytes = bytes;
}

size_t TC_BufferPool::GetMaxBytes() const
{
    return _maxBytes;
}
       内存池的主要目的, 还是为了提高效率。 后面我们要介绍的线程池, 也是类似道理。



评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值