1、單線程內(nèi)存池
內(nèi)存池的基本思想是大塊向系統(tǒng)申請(qǐng)內(nèi)存,內(nèi)部切割為小塊,內(nèi)部cache之后有選擇的分配,不夠的時(shí)候繼續(xù)向系統(tǒng)大塊申請(qǐng)內(nèi)存,示例代碼如下:
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;
}
詳細(xì)實(shí)現(xiàn)建議看云風(fēng)的內(nèi)存池,我也不過是學(xué)習(xí)了它的實(shí)現(xiàn)而已。
不要小看了單線程內(nèi)存池,它是我們走向更復(fù)雜應(yīng)用的基礎(chǔ),它是我們后面提及的多線程內(nèi)存池以及線程關(guān)聯(lián)內(nèi)存池的基礎(chǔ)。
這種單線程的內(nèi)存池分配釋放速度是很快的,比dlmalloc更快近1倍,大約相當(dāng)于malloc/free的50-100倍(具體倍率視分配的大小而不同,分配小塊倍率小,分配大塊倍率大)。
有的朋友可能會(huì)考慮使用std::list之類的東西來構(gòu)建內(nèi)存池,我奉勸有這種想法的人打住,std::list是效率很低的,此外用一個(gè)高層的東西構(gòu)建底層模塊,總體上屬于本末倒置。