2012-04-25 34 views
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(); 

     } 
} 

は今のブースト:: object_poolのコンストラクタは、Xのサイズを見つけるためにはsizeof(X)を使用していますので、それは、メンバ変数v1とv2は、実行時に成長することを見つける方法はありません。

  1. することは、私はそれがメモリプールを使用する目的だったそれをスピードアップするのではなく、パフォーマンスの低下につながる別の場所へのオブジェクトのコピーにつながることを推測しています。私の推測は正しいですか?そうでない場合、v1とv2が実行時に増加すると、何が起こりますか?

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

  3. 実行時にタイプXのオブジェクトをたくさん作成しています。 boost :: object_poolはこのシナリオで使用するのに適切なインターフェースですか?もしそうでなければ、私はこの問題に近づくでしょうか?

おかげ

答えて

3

はsizeof(V1)およびsizeof(V2)は、実行時に成長しません。彼らは内部的にポインタとヒープ割り当てを使います。

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

+0

はい、私は同じ種類のオブジェクトをたくさん割り当てています。ベクトルが大きくなると、プールからメモリを使用するようにするにはどうすればよいですか? – sank

+0

ブーストには、ベクトルによって使用されるfast_pool_allocatorもあります。たくさんのベクトルを何度も割り当てたり削除したりすると、perfを向上させることができます。ベクトルはすでに非常に効率的ですので、私は注意してこれを測定します。 –

2

誤った前提があります。 std::vectorの配列がヒープ上にあるため、sizeof()は決して変更されません。 boost::object_poolに何もコピーしてはいけません。それがあなたにとって正しい選択であるかどうかは、Xオブジェクトを作成および破棄する頻度で決まります。

関連する問題