Это - смущающий вопрос, но даже правильно написанная документация, которой предоставляют 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)
но я не понимаю то, что это означает, и я не могу найти примеры с помощью него.
Моя голова плавала в шаблонах весь день, таким образом, рука помощи, даже если ответ очевиден, будет значительно цениться.
cached_adaptive_pool имеет метод: void construct (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)
Думаю, я всегда могу использовать синтаксис размещения новый . Идея состоит в том, чтобы разыменовать интеллектуальный указатель (в данном случае offset_ptr), возвращаемый распределителем, а затем передать необработанный адрес в new ().
unique_ptr obj = new(&(*allocator_instance.allocate_one())) Test(1,true)
Это идиоматический способ сделать это? Есть так много других мест в boost, где предоставляется явная поддержка, чтобы избежать использования нового размещения, что заставляет меня думать, что нет. В любом случае я приму этот ответ, если в ближайшем будущем не будет предложено ничего лучше.