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/free50-100(具体倍率视分配的大小而不同,分配小块倍率小,分配大块倍率大)

 

有的朋友可能会考虑使用std::list之类的东西来构建内存池,我奉劝有这种想法的人打住,std::list是效率很低的,此外用一个高层的东西构建底层模块,总体上属于本末倒置。

Posted on 2010-10-03 13:51 袁斌 阅读(340) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理