1

boost :: object_poolを使用して、メンバー変数としてベクトルを含むタイプのオブジェクトにメモリを割り当てようとしています。

class X{
std::vector<Type> v1;
std::vector<Type> v2;

int a;
double b;
..
};


void func()
{
      boost::object_pool<X> p;
      for (int i = 0; i < 10000; ++i)
      {
        X * const t = p.malloc();

      }
}

これで、boost :: object_poolのコンストラクターはsizeof(X)を使用してXのサイズを検出するため、実行時にメンバー変数v1およびv2が大きくなることを検出する方法がありません。

  1. オブジェクトを別の場所にコピーする可能性があり、メモリプールを使用する目的であったオブジェクトを高速化するのではなく、パフォーマンスが低下する可能性があると推測しています。私の推測は正しいですか?いいえの場合、実行時にv1とv2が大きくなると、他に何が起こりますか?

  2. タイプベクトル(または実行時に大きくなる他のタイプ)のメンバー変数は、メモリにどのように配置されますか?オブジェクトには、ベクトル自体ではなく、ヒープ内のベクトルへのポインターが含まれていますか?ベクトルが大きくなるときに、プールのメモリを使用するようにするにはどうすればよいですか?

  3. 実行時にタイプXのオブジェクトをたくさん作成しています。boost :: object_poolは、このシナリオで使用するのに適切なインターフェイスですか?そうでない場合は、他にどのようにこの問題に取り組む必要がありますか?

ありがとう

4

2 に答える 2

3

sizeof(v1)とsizeof(v2)は実行時に大きくなりません。それらは内部でポインタとヒープ割り当てを使用します。

同じタイプのオブジェクトを多数割り当てる必要があり、それらすべてを一度にすばやく削除できる場合は、プールが適しています。

于 2012-04-25T14:11:53.753 に答える
2

あなたはいくつかの間違った仮定を持っています。の基になる配列std::vectorはヒープ上にあるため、sizeof()変更されることはありません。にコピーはまったくありませんboost::object_pool。それがあなたにとって正しい選択であるかどうかに関しては、それはあなたがXオブジェクトを作成および破壊することを計画している頻度に依存します。

于 2012-04-25T14:14:39.523 に答える