原理在STL源码剖析中已经有阐述,这里简单的说一下,该内存池采用HASH-LIST数据结构管理数据,分配一块内存时,如果所要求的内存超过了某个数量就直接调用malloc分配内存, 否则首先进行数据对齐,根据这个对齐的结果得到所在的HASH表,在该HASH-LIST中查找时候存在可用的节点,如果有就直接返回,否则每次以20个节点元素为数量开始增加LIST中的元素数量,如果仍然分配失败了就去下一个HASH表中查找可用内存,依次类推.
比如,这里的实现对齐大小为512字节,如果要求分配的内存不大于512字节就自动调整为512字节的数据大小,在512字节的HASH-LIST中查找可用节点.
代码和测试程序见附件,个人认为很巧妙,适合小对象的频繁分配/释放,效率比之单纯的使用malloc/free提高了很多.
不知道还有哪些优秀的内存池实现算法可以参考的?
BTW:这份代码不是我写的,网上搜索所得,作者模拟了SGI STL的内存池算法,我自己做了一些整理和注释,向作者致敬.
另外,在我的机器上的测试结果为:
采用内存池:
real 0m10.723s
user 0m10.710s
sys 0m0.000s
采用系统的malloc/free:
real 0m12.969s
user 0m12.950s
sys 0m0.000s
点击
这里下载代码.