1、单线程内存池
内存池的基本思想是大块向系统申请内存,内部切割为小块,内部cache之后有选择的分配,不够的时候继续向系统大块申请内存,示例代码如下:
struct tm_memblock
{
tm_memblock *next;
};
class tm_pool
{
…
tm_bufunit *next; //pool中自由块链
tm_memblock *mbk; //trunk表
…
};
void *tm_pool::newobj()
{
if(! next)
{
expand();
}
tm_bufunit *head = next;
next = head->next;
return (void *)head;
}
void tm_pool::delobj(void *pbuf)
{
tm_bufunit *head = (tm_bufunit*)(pbuf);
head->next = next;
next = head;
}
详细实现建议看云风的内存池,我也不过是学习了它的实现而已。
不要小看了单线程内存池,它是我们走向更复杂应用的基础,它是我们后面提及的多线程内存池以及线程关联内存池的基础。
这种单线程的内存池分配释放速度是很快的,比dlmalloc更快近1倍,大约相当于malloc/free的50-100倍(具体倍率视分配的大小而不同,分配小块倍率小,分配大块倍率大)。
有的朋友可能会考虑使用std::list之类的东西来构建内存池,我奉劝有这种想法的人打住,std::list是效率很低的,此外用一个高层的东西构建底层模块,总体上属于本末倒置。