利用默认的内存管理函数new/delete或malloc/free在堆上分配和释放内存会有一些额外的开销。
系统在接收到分配一定大小内存的请求时,首先查找内部维护的内存空闲块表,并且需要根据一定的算法(例如分配最先找到的不小于申请大小的内存块给请求者,或者分配最适于申请大小的内存块,或者分配最大空闲的内存块等)找到合适大小的空闲内存块。如果该空闲内存块过大,还需要切割成已分配的部分和较小的空闲块。然后系统更新内存空闲块表,完成一次内存分配。类似地,在释放内存时,系统把释放的内存块重新加入到空闲内存块表中。如果有可能的话,可以把相邻的空闲块合并成较大的空闲块。
默认的内存管理函数还考虑到多线程的应用,需要在每次分配和释放内存时加锁,同样增加了开销。
可见,如果应用程序频繁地在堆上分配和释放内存,则会导致性能的损失。并且会使系统中出现大量的内存碎片,降低内存的利用率。
默认的分配和释放内存算法自然也考虑了性能,然而这些内存管理算法的通用版本为了应付更复杂、更广泛的情况,需要做更多的额外工作。而对于某一个具体的应用程序来说,适合自身特定的内存分配释放模式的自定义内存池则可以获得更好的性能。
参考资料
1、http://blog.csdn.net/shawngucas/article/details/6574863
2、http://www.ibm.com/developerworks/cn/linux/l-cn-ppp/index6.html ()
3、http://www.cppblog.com/jaxe/archive/2009/09/27/97362.html
根据参考2 提供的方法,C实现的内存池
4、http://www.cnblogs.com/dylantsou/archive/2012/05/13/2498491.html
根据参考2 提供的方法,C++ 实现的内存池
5、http://256.com/sources/mpool/
一个内存池的lib库,实现可申请任意长度的内存大小。
内存池设计及实现参考资料