您的位置:首页 > 移动开发 > Objective-C

BOOST内存管理(一) --- boost::object_pool

2016-03-17 11:06 465 查看
boost pool是个不错的库,可以省点内存管理功夫,内存池分配内存,还可以速度上比malloc更快一些。

boost::object_pool主要针对,对象的内存分配,他可以像使用new 一样来创建对象,对象的内存放在object_pool里面。

实际上object_pool使用pool类,代码上是object_pool继承pool类,object_pool比pool多些什么呢,多的就是new 比malloc多的那些内容.

object_pool::construct完成类的内存分配和建构,object_pool::destroy完成类的析构和内存释放。

看看实际例子:

#include "stdafx.h"
#include <malloc.h>
#include <boost/pool/object_pool.hpp>
#include <boost/serialization/singleton.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/timer.hpp>

class ObjectMgr;
typedef boost::unique_lock<boost::mutex> WriteLock;
typedef boost::serialization::singleton<ObjectMgr> ObjectMgrFactory;

struct myObject
{
int a;
char b;

myObject ()
{
a=0;
b=0;
}
};

class ObjectMgr
{
public:
myObject* CreateNewObject(myObject o)
{
WriteLock wl(mt);
return pool.construct(o);
}

void free(myObject *po)
{
WriteLock wl(mt);
if (pool.is_from(po))
{
pool.destroy(po);
}
}

private:
boost::object_pool<myObject> pool;
boost::mutex mt;
};

int _tmain(int argc, _TCHAR* argv[])
{
boost::timer t;
for (int i=0;i<20*1024*1024;i++)
{
myObject to;
to.a = 2*i;
to.b = i;

//方式一: objectpool  debug:14.553秒 260兆         release:0.674秒 260兆
//ObjectMgrFactory::get_mutable_instance().CreateNewObject(to);

//方式二: new         debug:14.91秒 1420兆         release:11.815秒 610兆
//myObject *pmyObject = new myObject(to);

//方式三: malloc      debug:14.926秒 1400兆         release:11.737秒 630兆
//myObject *pmyObject = (myObject *)malloc(sizeof(myObject));

//方式四: pool        debug:59.235秒 0兆            release:22.116秒 630兆
boost::pool<> pObj(sizeof(myObject));
myObject *pmyObject = (myObject *)pObj.malloc();
}
std::cout << "use time "<<t.elapsed()<<std::endl;

return 0;
}


总结:

1.无论哪种方式的申请内存,占用空间都比有用空间大点,实际有用空间:8字节 * 20*1024*204 = 160兆

2.new和malloc无论在debug还是release下,占用内存资源和CPU资源都差不多

3.使用boost中的object_pool无论从内存消耗还是从速率上来讲都比new和malloc好,尤其是使用release的时候分配资源的速度

4.在操作大数据的时候,最好使用boost中的boost_pool
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: