3.2. 記憶領域の割り当て

Bezelのすべてのコンテナは、記憶領域の割り当て方法を制御するためのポリシークラスを受け付けることができる。割り当てポリシーを指定することで、コンテナが用いる記憶領域の割り当て方法を選択することができる。

記憶領域の割り当てを指定するポリシークラスは、単一のオブジェクトを扱うためのスカラー割り当てポリシーと、連続する複数のオブジェクトを扱うための配列割り当てポリシーに大別される。listmapのような要素が不連続なコンテナに対してはスカラー割り当てポリシーを、vectorのような要素が連続するコンテナに対しては配列割り当てポリシーを指定する。

代表的なスカラー割り当てポリシーは次の通り。すべて名前空間bezel::scalar_allocation_policy内に定義されている。

operator_new

operator newを用いて記憶領域を割り当てる。デフォルトの割り当てポリシーとして使用される。

std_malloc<>

std::mallocを用いて記憶領域を割り当てる。

purged<P>

下位ポリシーPを用いて記憶領域を割り当てるが、領域開放時にゼロクリアを行う。

pool<P1, P2, P3>

下位ポリシーP1を用いて記憶領域を割り当てるが、複数の割り当てをまとめて行ったり解放を遅らせるなどして割り当てに要する実行時間を削減する。割り当ておよび開放の行い方はP2およびP3にて指定する。

std_mallocの扱い方は、例 3.8. 「mapの使い方 (2)」で示した通りである。operator_newの扱い方も同様である。

purgedプロキシポリシーと呼ばれるもので、同種のポリシー(ここではスカラー割り当てポリシー)を下位ポリシーとして使用する。purgedは、記憶領域の割り当ては下位ポリシーにそのまま行わせるが、領域開放を行う際には領域をゼロクリアしてから下位ポリシーに開放を行わせる。例えば下位ポリシーとしてoperator_newを指定するなら、次のように記述する。

例 3.9. スカラー割り当てポリシー: purged

#include <bezel/list.h>
#include <bezel/scalar_allocation_policy/operator_new.h>
#include <bezel/scalar_allocation_policy/purged.h>

void foo()
{
  using namespace bezel::list;
  using namespace bezel::scalar_allocation_policy;

  typedef list<int, allocation_is<purged<operator_new> > > C;

  ...
}

poolは、開放するべき領域をある期間開放せずに保持(プール)しておき、再度記憶領域割り当てを要求されたときにプールしておいた領域を再利用する割り当てポリシーである。再利用の効率によっては実行時間を短縮できる。poolもまたpurgedと同じくプロキシポリシーだが、第2テンプレートパラメータ以降に割り当てと開放を調整するためのパラメータを指定することができる。例えば割り当ては必要になった時点で行い、開放は10個ずつまとめて行うようにするなら、次のように記述する。

例 3.10. スカラー割り当てポリシー: pool

#include <bezel/list.h>
#include <bezel/scalar_allocation_policy/operator_new.h>
#include <bezel/scalar_allocation_policy/pool.h>
#include <bezel/scalar_allocation_policy/pool_acquisition_policy/ondemand.h>
#include <bezel/scalar_allocation_policy/pool_release_policy/static_constant.h>

void foo()
{
  using namespace bezel::list;
  using namespace bezel::scalar_allocation_policy;

  typedef list<
    int,
    allocation_is<
      pool<
        operator_new,
        pool_acquisition_policy::ondemand,
        pool_release_policy::static_constant<10> > >
  > C;

  ...
}

代表的な配列割り当てポリシーは次の通り。すべて名前空間bezel::array_allocation_policy内に定義されている。スカラー割り当てポリシーとは異なり、割り当てた記憶領域をプールするポリシーは用意されていない。

operator_new

operator new[]を用いて記憶領域を割り当てる。デフォルトの割り当てポリシーとして使用される。

std_malloc<>

std::mallocを用いて記憶領域を割り当てる。

purged<P>

下位ポリシーPを用いて記憶領域を割り当てるが、領域開放時にゼロクリアを行う。

std_mallocの扱い方は、例 3.2. 「vectorの使い方 (2)」で示した通りである。operator_newpurgedの扱い方はスカラー割り当てポリシーの場合と同一である。