Должен ли новый код на С++ использовать ресурсы памяти вместо распределителей?
С++ 17 принесет нам std::pmr::memory_resource
, который является чистым интерфейсом для выделения и освобождения памяти. В отличие от концепции Allocator, она делает именно это и не более того. Также будет std::pmr::polymorphic_allocator
, который переносит ресурс памяти в классический распределитель, поэтому его можно использовать с существующими контейнерами.
Если я собираюсь написать новый контейнер (или другой, голодный память) тип таргетинга на С++ 17 и более поздний, должен ли я продолжить программирование против концепции Allocator или, скорее, использовать более новую и более чистую абстракцию напрямую?
На данный момент мои мысли идут так.
Причины продолжения использования распределителей:
- Это соответствует стандартной библиотеке и существующему коду. Даже новые псевдонимы
std::pmr::*
продолжают использовать распределители.
- Поскольку ресурс памяти может быть обернут в
std::pmr::polymorphic_allocator
, интерфейс распределителя более общий и удовлетворяет потребности большего числа клиентов.
- Ресурсы памяти всегда используют полиморфизм во время выполнения, поэтому они имеют незначительную дополнительную временную нагрузку по сравнению с абстракцией нулевой накладной, которую могут предоставить распределители.
- Возможно, кому-то действительно нужны другие части интерфейса распределителя (такие как пользовательские типы указателей), которые не могут быть предоставлены чистым ресурсом памяти.
Причины использования ресурсов памяти вместо распределителей:
- Интерфейс распределителя является неудобным и трудно реализуемым. Интерфейс
std::pmr::memory_resource
чистый и прямой.
- Поскольку ресурсы памяти являются полиморфными, они не влияют на тип контейнера, что означает меньшее количество экземпляров шаблонов (и, следовательно, возможно, более быстрые компиляции и меньшие исполняемые файлы) и позволяет нам перемещать больше кода в отдельные единицы перевода.
- Если объект использует ресурс памяти, он всегда может создавать экземпляр под-объекта, который все еще использует распределители, путем переноса ресурса памяти в
std::pmr::polymorphic_allocator
. Другой путь более сложный.
- В любом случае распределение памяти является относительно трудоемкой задачей. Один вызов виртуальной функции не требует значительных накладных расходов, относительно говоря.
Существуют ли какие-либо рекомендации по эффективному использованию новой функции библиотеки?
Ответы
Ответ 1
В этот момент нет.
Активаторы в С++ в настоящее время намного проще, чем раньше.
Они обеспечивают поддержку pmr и classic allocator.
Что еще более важно, распределение на основе pmr не использовалось в течение многих лет. Любые недостатки могут все же появиться.
Распределители с быстрым пулом или даже фиксированные буферы или расширения sbo могут заметить служебные данные виртуализации.