Я ищу реализовать (дважды) связанный список, который только звонки 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
если я хочу их в пользовательском пуле памяти тоже.)
Ты должен:
MyAllocator
это удовлетворяет Allocator
требования ([allocator.requirements] в стандарте).std::list<T, MyAllocator<T> >
вместо std::list<T>
,Если вам нужен тип вашего списка, чтобы быть конкретно std::list<T>
(например, потому что вы хотите вызвать функции, которые принимают std::list<T> &
и чей интерфейс вы не можете изменить), то вам не повезло, потому что тип распределителя является частью типа контейнера.
Будьте осторожны с требованиями распределителя, они странные. В частности вам понадобится rebind
для list
и это немного сложно.
Кроме того, в C ++ 03 нет гарантии, что распределитель экземпляры уважаются, только распределитель тип, что фактически означает, что указатель на пул, из которого вы выделяете данные, должен храниться со статической продолжительностью, а не как переменная экземпляра. Я думаю, что это изменилось в C ++ 11, но я могу ошибаться. Это действительно важно, если вы хотите использовать несколько разных пулов в своей программе.
Других решений пока нет …