开源C++函数库Boost内存池使用与测试(二)

2014-11-24 12:48:02 · 作者: · 浏览: 1
释放时,不仅要进行内存操作,同时还要调用构造和析购函数。因此有必要对C++对象也进行内存池的测试。
  代码如下:#include "stdafx.h" #include #include #include #include #include using namespace std;using namespace boost;
  const int MAXLENGTH = 500000;class A { public:A()
  { m_i++;} ~A( )
  { m_i——;} private:int m_i;};
  int main ( )
  { object_pool q;
  clock_t clock_begin = clock();for (int i = 0; i < MAXLENGTH; ++i)
  { A* a = q.construct();q.destroy(a);}
  clock_t clock_end = clock();cout<<"程序运行了 "<   clock_begin = clock();for (int i = 0; i < MAXLENGTH; ++i)
  { A* a = new A;delete a;} clock_end = clock();cout<<"程序运行了 "<   return 0;}测试结果如下:
  结论:在反复申请和释放50万个
C++对象的情况下,使用内存池耗时是使用new耗时的112.03%.这是因为内存池的construct和destroy函数增加了函数调用次数的原因。这种情况下使用内存池并不能获得性能上的优化。
  4. Boost内存池的分类Boost内存池按照不同的理念分为四类。主要是两种理念的不同造成了这样的分类。
  一是Object Usage和Singleton Usage的不同。Object Usage意味着每个内存池都是一个可以创建和销毁的对象,一旦内存池被销毁则其所分配的所有内存都会被释放。Singleton Usage意味着每个内存池都是一个被静态分配的对象,直至程序结束才会被销毁,这也意味着这样的内存池是多线程安全的。只有使用release_memory或者 purge_memory方法才能释放内存。
  二是内存溢出的处理方式。第一种方式是返回NULL代表内存池溢出了;第二种方式是抛出异常代表内存池溢出。
  根据以上的理念,boost的内存池分为四种。
  4.1 Pool Pool是一个Object Usage的内存池,溢出时返回NULL. 4.2 object_pool object_pool与pool类似,唯一的区别是当其分配的内存释放时,它会尝试调用该对象的析购函数。
  4.3 singleton_pool singleton_pool是一个Singleton Usage的内存池,溢出时返回NULL. 4.4 pool_alloc pool_alloc是一个Singleton Usage的内存池,溢出时抛出异常。
  5. 内存池溢出的原理与解决方法5.1 必然溢出的内存内存池简化了很多内存方面的操作,也避免了一些错误使用内存对程序造成的损害。但是,使用内存池时最需要注意的一点是要处理内存池溢出的情况。
  没有不溢出的内存,看看下面的代码:#include "stdafx.h" #include #include #include #include #include using namespace std;using namespace boost;
  int _tmain(int argc, _TCHAR* argv[])
  { clock_t clock_begin = clock();int iLength = 0;for (int i = 0; ;++i)
  { void* p = malloc(1024*1024);&