BlockPool
|
Table of Contents
|
概览
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
- 使用的线程模型(ThreadModel)。可以是SingleThreadModel, MultiThreadModel等。
构造函数
BlockPoolT(int cbFreeLimit, int cbBlock);
cbBlock
- 指单个MemBlock的字节数。关于MemBlock的概念,请参考《内存池(MemPool)技术详解》。
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)





