Ищу реализовать (дважды), связанный список, который только звонки placement new
внутренне, направляя всю память в пул, наделенного что-то вроде:Размещение нового с станд :: Список
char *memPool = new char[4096]; // One-off normal 'new'
Изначально я был собирается реализовать мой собственный класс, который берет указатель на пул выделенных ресурсов (класс управления a). Однако сначала хочу быть уверенным, что я не могу достичь такого же результата с std::list
. В частности, меня беспокоит the third section of David Rodríguez's answer to this SO question.
Это имеет смысл, что std::list
придется звонить new
и delete
на его составные узлы, но я хочу, чтобы изменить это поведение так, что все узлы должны быть наделив placement new
в мой пользовательский бассейн. Поэтому мой вопрос:
Есть ли способ, чтобы указать, что placement new
std::list
, такие как:
std::list<std::shared_ptr<Cls>> myList = new (pool.getFreeAddr()) list<Cls>;
следует также выделить свои узлы с помощью пользовательского аллокатора, так что всего хранятся строго внутри мои пул памяти?
(Примечание: Я отдаю себе отчет в необходимости использования функций пользовательского выделения/удаления, с shared_ptrs
, если я хочу их в бассейне пользовательских памяти тоже.)
** Написание ** 'rebind' тривиально. Логика, стоящая за ней, сложна. –
@PeteBecker: хороший пункт. Но это означает, что, например, ваш распределитель не может предположить (возможно, как оптимизацию), что он будет использоваться только с типом 'T', который вы указываете в контейнере. Полагаю, мне не нужно упоминать об уловке - этот факт должен быть очевидным в любом случае, учитывая, что он используется связанным списком, а «rebind» - это всего лишь механизм. –
Нет, это следует упомянуть; это просто, что хитрость заключается в том, что он делает **, а не в том, чтобы писать на самом деле. –