Средства выделения C++, специфически передающие аргументы конструктора объектам выделили с повышением:: межпроцессный:: cached_adaptive_pool

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

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

7
задан porgarmingduod 7 April 2010 в 21:22
поделиться

2 ответа

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)
1
ответ дан 7 December 2019 в 18:41
поделиться

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

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

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

1
ответ дан 7 December 2019 в 18:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: