为何要使用内存池
利用默认的内存管理函数,在堆上分配和释放内存会有一些额外的开销。
系统在接收到分配一定大小内存的请求时,首先查找内部维护的内存空闲块表,并且需要根据一定的算法找到合适大小的空闲内存块。其间,还涉及到空闲内存块的分割、合并等问题。
默认的内存管理函数还考虑到多线程的应用,需要在每次分配和释放内存时加锁,同样增加开销。
频繁在堆上分配和释放内存,会导致性能的损失,并且使得系统中出现大量的内存碎片,降低利用率。
所以,对某个具体的应用程序来说,自定义适合自身的内存池,可以获得更好的性能。
内存池的分类
从线程安全的角度来分,单线程内存池性能更高,多线程内存池适用范围更广(多个线程共享,每次分配和释放内存时加锁)[1]。
从可分配内存单元大小来分,可分为固定内存池和可变内存池。
内存池的优点
1) 针对特殊情况,例如需要频繁分配释放固定大小[2]的内存对象时,不需要复杂的分配算法[3]和多线程保护,也不需要维护内存空闲表的额外开销,从而获得较高的性能。
2) 由于开辟一定数量的连续内存空间作为内存池块,因而提高了程序局部性,提升了程序性能[4]。
3) 比较容易控制页边界对齐和内存字节对齐,没有内存碎片的问题[5]