7

これは恥ずかしい質問ですが、boost.interprocessで提供されるよく書かれたドキュメントでさえ、これを行う方法を理解するのに十分ではありませんでした。

私が持っているのはcached_adaptive_poolアロケータインスタンスであり、これを使用してオブジェクトを構築し、コンストラクターパラメーターを渡します。

struct Test {
  Test(float argument, bool flag);
  Test();
};

// Normal construction
Test obj(10, true);
// Normal dynamic allocation
Test* obj2 = new Test(20, false);

typedef managed_unique_ptr<
    Test, boost::interprocess::managed_shared_memory>::type unique_ptr;

// Dynamic allocation where allocator_instance == cached_adaptive_pool,
// using the default constructor
unique_ptr obj3 = allocator_instance.allocate_one()
// As above, but with the non-default constructor
unique_ptr obj4 = allocator_instance ... ???

これは、一般的なアロケータオブジェクトの使用方法に関する私の側の失敗である可能性が非常に高いです。しかし、いずれにせよ、cached_adaptive_poolで指定されたインターフェイスを使用して、この特定のアロケータを使用してコンストラクター引数をオブジェクトに渡す方法がわかりません。

cached_adaptive_pool方法があります:void construct(const pointer & ptr, const_reference v)しかし、それが何を意味するのか理解できず、それを使用した例を見つけることができません。

私の頭は一日中テンプレートで泳いでいるので、答えが明白であっても、助けの手は大いに感謝されます。

4

2 に答える 2

1

cached_adaptive_poolのメソッドはvoidconstruct(const pointer&ptr、const_reference v)ですが、それが何を意味するのか理解できず、それを使用した例を見つけることができません。

のインターフェイスに従う必要がありますstd::allocator。この場合、初期化されallocate()ていないメモリの適切なチャンクが提供さconstruct()れ、指定されたポインタで新しい配置が呼び出されます。

何かのようなもの:

allocator_instance.construct(allocator_instance.allocate_one(), Test(30, true));

ただし、これらのプールを自分で使用したことはありません。C ++ 0xでは、アロケーターはコピーコンストラクターだけでなく、任意のコンストラクターを呼び出すことができるはずなので、boostのアロケーターはすでにある程度これをサポートしている可能性があります。

a.construct(p, 30, true); //a C++0x allocator would allow this and call new (p) Test(30, true)
于 2010-04-07T22:09:00.510 に答える
1

私はいつでも配置の新しい構文を使用できると思います。アイデアは、アロケーターによって返されたスマート ポインター (この場合は offset_ptr) を逆参照し、生のアドレスを new() に渡すことです。

unique_ptr obj = new(&(*allocator_instance.allocate_one())) Test(1,true)

これはこれを行う慣用的な方法ですか?ブーストには、placement new の使用を避けるために明示的なサポートが提供されている場所が他にもたくさんありますが、そうではないと思います。いずれにせよ、近い将来にこれ以上のものが提供されない場合は、この回答を受け入れます。

于 2010-04-07T22:02:33.063 に答える