boost::pool

トップページ > メモリ管理 >

abstract

必要なヘッダ
<boost/pool/pool.hpp>,
<boost/pool/object_pool.hpp>,
<boost/pool/singleton_pool.hpp> など。 使うtemplateに応じて。
出来ること
固定サイズの高速メモリ割り当て
リファレンス
en / jp

sample

サンプルの動作確認バージョン [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

etc

小規模オブジェクトの割り当てや解放を大量に行うときに、 効率的なメモリ管理ができるそうです。 私は計測したことがないので、効果のほどは未知数…。

presented by k.inaba (kiki .a.t. kmonos.net) under CC0