サンプルの動作確認バージョン [GCC4.4/1.41.0] [VC9/1.41.0]
#include <iostream>
#include <boost/pool/pool.hpp>
#include <boost/pool/object_pool.hpp>
using namespace std;
struct Abc
{
Abc() { static int no=0; cout << "Abc() :" << (m_no=++no) << endl; }
~Abc() { cout << "~Abc():" << m_no << endl; }
int m_no;
};
int main()
{
{
// sizeof(int)バイト専用アロケータ
boost::pool<> p( sizeof(int) );
int* x = (int*)p.malloc();
int* y = (int*)p.malloc();
int* z = (int*)p.malloc();
*x = 10;
p.free(z); // 明示的にfree
// freeせずともpoolオブジェクトの寿命と同時に解放される
}
{
// Abc専用アロケータ
boost::object_pool<Abc> p;
Abc* x = p.construct();
Abc* y = p.construct();
Abc* z = p.construct();
p.destroy(y);// 明示的にデストラクタ呼出
// destroyせずともpoolオブジェクトの寿命と同時に解放される
}
return 0;
}
Abc() :1 Abc() :2 Abc() :3 ~Abc():2 ~Abc():1 ~Abc():3
小規模オブジェクトの割り当てや解放を大量に行うときに、 効率的なメモリ管理ができるそうです。 私は計測したことがないので、効果のほどは未知数…。