Размещение нового с std :: list

Я ищу реализовать (дважды) связанный список, который только звонки placement new внутренне, направляя всю память в пул, выделенный чем-то вроде:

char *memPool = new char[4096]; // One-off normal 'new'

Первоначально я собирался реализовать свой собственный класс, который принимает указатель на (выделенный класс) предварительно выделенный пул памяти. Однако сначала я хочу быть уверен, что не смогу добиться того же результата с std::list, Особенно, третий раздел ответа Дэвида Родригеса на этот вопрос беспокоит меня

Это имеет смысл, что std::list придется позвонить new а также delete на его компонентных узлах, но я хочу изменить это поведение, чтобы все узлы были выделены с placement new в мой пользовательский пул. Поэтому мой вопрос:

Есть ли способ указать, что placement new std::list такие как:

std::list<std::shared_ptr<Cls>> myList = new (pool.getFreeAddr()) list<Cls>;

следует также выделить свои узлы, используя собственный распределитель, так что все хранится строго в моем собственном пуле памяти?

(Заметка: Я знаю о необходимости использовать пользовательские функции выделения / удаления с shared_ptrs если я хочу их в пользовательском пуле памяти тоже.)

4

Решение

Ты должен:

  • Написать шаблон класса MyAllocator это удовлетворяет Allocator требования ([allocator.requirements] в стандарте).
  • Использовать std::list<T, MyAllocator<T> > вместо std::list<T>,

Если вам нужен тип вашего списка, чтобы быть конкретно std::list<T> (например, потому что вы хотите вызвать функции, которые принимают std::list<T> & и чей интерфейс вы не можете изменить), то вам не повезло, потому что тип распределителя является частью типа контейнера.

Будьте осторожны с требованиями распределителя, они странные. В частности вам понадобится rebind для listи это немного сложно.

Кроме того, в C ++ 03 нет гарантии, что распределитель экземпляры уважаются, только распределитель тип, что фактически означает, что указатель на пул, из которого вы выделяете данные, должен храниться со статической продолжительностью, а не как переменная экземпляра. Я думаю, что это изменилось в C ++ 11, но я могу ошибаться. Это действительно важно, если вы хотите использовать несколько разных пулов в своей программе.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]