Распределители C ++, конкретно передающие аргументы конструктора объектам, выделенным с помощью boost :: interprocess :: cached_adaptive_pool - PullRequest
7 голосов
/ 08 апреля 2010

Это неловкий вопрос, но даже хорошо написанной документации, поставляемой с boost.interprocess, мне было недостаточно, чтобы понять, как это сделать.

То, что у меня есть cached_adaptive_pool экземпляр allocator, и я хочу использовать его для создания объекта, передавая параметры конструктора:

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) но я не понимаю, что это значит, и я не могу найти примеры, использующие его.

Моя голова весь день плавает в шаблонах, поэтому рука помощи, даже если ответ очевиден, будетс благодарностью.

Ответы [ 2 ]

1 голос
/ 08 апреля 2010

cached_adaptive_pool имеет метод: пустая конструкция (константный указатель & 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)
1 голос
/ 08 апреля 2010

Я думаю, что всегда могу использовать размещение нового синтаксиса. Идея состоит в том, чтобы разыменовать умный указатель (в данном случае offset_ptr), возвращаемый распределителем, и затем передать необработанный адрес в new ().

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

Это идиоматический способ сделать это? Есть много других мест в boost, где предоставляется явная поддержка, чтобы избежать использования размещения new, что заставляет меня думать нет. В любом случае, я приму этот ответ, если в ближайшее время ничего не будет предоставлено.

...