Подтвердить что ты не робот

Должен ли новый код на С++ использовать ресурсы памяти вместо распределителей?

С++ 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. Другой путь более сложный.
  • В любом случае распределение памяти является относительно трудоемкой задачей. Один вызов виртуальной функции не требует значительных накладных расходов, относительно говоря.

Существуют ли какие-либо рекомендации по эффективному использованию новой функции библиотеки?

4b9b3361

Ответ 1

В этот момент нет.

Активаторы в С++ в настоящее время намного проще, чем раньше.

Они обеспечивают поддержку pmr и classic allocator.

Что еще более важно, распределение на основе pmr не использовалось в течение многих лет. Любые недостатки могут все же появиться.

Распределители с быстрым пулом или даже фиксированные буферы или расширения sbo могут заметить служебные данные виртуализации.