网上找了好多内存池的实现方法,大同小异,但都有个缺点,对于用户来说不好用,很多需要重载类的new和delete方法,要么继承一个重载了上述两个方法的父类。
今天详细看了下公司项目上的内存池的实现,写的很好,最起码用户用起来很舒服。但由于借鉴了公司内部代码,那源码就不能上传了。
相比两种实现,我觉得区别的关键点在于:C++ 的new操作符不仅分配了内存,并且调用了构造函数,而我们自己的内存池只是分配了内存,无法构造对象,所以大部分的内存池实现都需要重载new和delete。
这里要提到一个知识点:定位放置 new,那什么是定位放置 new呢?就是在特定的内存位置上,构造一个对象。那这个特定的内存位置是什么?那就是我们的内存池给分配的内存空间啊,说到这是不是忽然开朗了。
不多说,来几句伪代码说下定位放置 new的具体用法:
// 分配空间
void* pData = malloc(sizeof(_T));
// 在已分配的空间上构造对象
new(pData) _T();
至于具体的内存池逻辑,网上很多,就不具体说了