最近一直在搞内存池,这一块之前一直没有注意过,最近看书看到这一块,发现挺重要的,琢磨了挺长时间,也在github上找了很多代码,感觉都不太好,最后是看《深入实践C++模板编程》书中的实现,感觉还不错,就自己敲了一下并分析理解了原理,感觉受益匪浅。
简介
什么是内存池?为什么要使用内存池?
简单的来说就是,如果我们要给很多元素分配内存,如果我们一个个用malloc分配,因为malloc本身调用非常慢,所以数据量大时耗费在malloc上的时间将会很多。内存池就是先分配一块比较大的内存,再对这块已经分配的内存进行管理,对元素进行分配,这样可以节约比较多的时间。
内存池和allocator的关系
allocator是分配器,STL中大量使用它,比如vector等,我们平时使用的vector<int>实际上是隐含了分配器,实际真正的调用应该是vector<int, std::allocator<int>>,也就是说真正的内存管理是通过allocator来进行的。实际上std::allocator的实现就是通过内存池,而且性能还不错。
下面的表格是一个分配器所需实现的内存处理成员函数:
成员函数 | 简介 |
---|---|
allocate | 分配未初始化的存储 |
deallocate | 解分配存储 |
construct | 在分配的存储构造对象 |
destroy | 析构在已分配存储中的对象 |
这里要注意deallocate和destroy的差别,deallocate的作用是将不用的块重新放回空闲列表,