BlockPool

概览

BlockPool 就是通常我们所说的内存池(Memory Pool)。但是它比一般的内存池要简单很多,因为它只是管理MemBlock,而不负责对MemBlock进行结点(Node)1的划分(这个工作实际上由AutoFreeAllocT完成了)。

关于该类的实现细节,请参考《内存池(MemPool)技术详解》。

规格

template <class ThreadModel>
class BlockPoolT
{
public:
    BlockPoolT(int cbFreeLimit, int cbBlock);
    ~BlockPoolT(); // 析构,将调用clear()清理内存
 
    void* allocate(size_t cb);  // 申请一个MemBlock
    void deallocate(void* p); // 释放一个MemBlock
    void clear(); // 清空所有申请的内存
};

该类一般和ScopeAlloc搭配使用,用作ScopeAlloc的后台存储。

ThreadModel

构造函数

BlockPoolT(int cbFreeLimit, int cbBlock);

cbBlock

cbFreeLimit

  • 限制BlockPool占用的自由内存最大值。
  • 大家都知道,内存池技术在释放内存时,它并不是将内存真的释放(还给系统),而是记录到一个FreeList中,以加快内存申请的速度。但是这带来的一个问题是,内存池随着时间的推移,其占有的内存会不断地增长,从而不断地吃掉系统的内存。cbFreeLimit的引入是很好地限制了FreeList中的内存总量,从而抑制这种情况的发生。在BlockPool中的FreeList内存达到cbFreeLimit时,deallocate操作将直接释放MemBlock。

allocate - 申请一个MemBlock

void* allocate(size_t cb);

cb

  • 要申请的内存大小,以字节(byte)为单位。cb应该满足:cb >= cbBlock。其中cbBlock是指构造函数传入的cbBlock。
  • 如果 cb > cbBlock,那么直接使用 malloc 申请内存。如果 cb <= cbBlock,那么从FreeList中取出一块内存返回(如果FreeList为空,则用 malloc 申请一块大小为 cbBlock 的内存。

deallocate - 释放一个MemBlock

void deallocate(void* p);

p

  • 要释放的内存(MemBlock)指针。如果本BlockPool实例的FreeList的内存占用(指那些占用但没有被使用的内存)超过cbFreeLimit,则直接 free(p),否则将该内存加入FreeList中。

clear - 清空所有申请的内存

void clear();
  • 该函数由析构函数调用,不推荐直接使用该函数。

相关参考

page_revision: 3, last_edited: 1201144805|%e %b %Y, %H:%M %Z (%O ago)
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License