本文共 1164 字,大约阅读时间需要 3 分钟。
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内存池的主要目的, 还是为了提高效率。 后面我们要介绍的线程池, 也是类似道理。(s.data); } else if (_totalBytes >= _maxBytes) { // 占用内存过多,就不还给pool delete[] reinterpret_cast (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;}
转载地址:http://qgwti.baihongyu.com/