Я понимаю, что расширенные навязчивые коллекции в конечном итоге хранят ссылки на объекты и, таким образом, для объектов требуется собственное управление временем жизни.
Мне было интересно, могу ли я просто использовать Boost Pool для управления этим временем жизни. Когда я хочу сохранить новый объект в навязчивом списке Boost, могу ли я просто выделить объект из Boost Pool и сохранить его в списке? Затем, когда я удаляю из списка, я освобождаю, используя пул повышения.
Ответ — да.
Это тоже не очень типично.
Если вы хотите контролировать когда а также где память выделена, вы используете пул.
Если вы хотите отделить структуру памяти вашей структуры данных и ее семантику, вы используете навязчивый контейнер.
Итак, есть приятное место, но это будет выглядеть так:
vector<MyElement, custom_allocator>
)Бесполезные замечания:
затем, когда я удаляю из списка, я освобождаю, используя пул повышения
Типичным сценарием использования пула является явный случай, когда вы хотите / не / должны освободить элементы (остерегайтесь нетривиальные деструкторы). В противном случае вы просто перемещаете неэффективность локальной кучи в пул (фрагментация, блокировка).
объекты нуждаются в собственном управлении временем жизни
Это звучит немного странно. Фактически, объект не должен иметь «своего» управления временем жизни. Просто их жизнь не регулируется навязчивой структурой данных, в которой они участвуют.
Например. сохраняя все элементы в векторе, вы получаете непрерывное хранилище, а время жизни всех элементов определяется вектором[1]. Следовательно, вы можете отделить время жизни элемента и его распределение от семантики контейнера.
[1] любые проблемы, связанные с перераспределением вектора, обычно предотвращаются за счет резервирования достаточной емкости. Если вы это сделаете, вы поймете, что это очень похоже на распределитель пула фиксированного размера, но с дополнительной гарантией нулевой фрагментации. Если вам не нужно последнее, вы можете сделать list<T, pool_allocator<T> >
Таким образом, вы получаете местность ссылки, но стабильные ссылки на вставку / удаление. И т. Д.