Какова цель и использование `memory_resource`?

Стандарт C++17 включает новое пространство имен pmr, включающее набор классов, сгруппированных под именем memory_resource.

После поиска в Интернете я нашел очень мало вульгарной информации о нем, прямое следствие этого вопроса:

Какие основные идеи лежат в основе pmr и особенно pmr::memory_resource?


Детализируя немного больше вопрос, некоторые из вопросительных знаков в моей голове:

  • Что он приносит нового или какие ограничения решает?
  • В чем разница с allocator?
  • Означает ли полиморфность, что можно выбрать время выполнения allocator, предоставленное конструктору контейнера? (например, для целей тестирования)
  • Помогает ли это реализовать пул памяти или другие схемы управления памятью?

Контекст:

В целях создания распределителя memory pool я нашел информацию об этом пространстве имен. Чтение таких имен, как pool_options или polymorphic_allocator, привлекло мое внимание.


Связанные вопросы:

polymorphic_allocator: когда и зачем его использовать?


person Adrian Maire    schedule 28.06.2017    source источник
comment
en.cppreference.com/w/cpp/memory/memory_resource   -  person πάντα ῥεῖ    schedule 28.06.2017
comment
Также см. stackoverflow.com/questions/38010544/   -  person Curious    schedule 28.06.2017
comment
@Curious: Очень интересная ссылка, и если вы согласны, я расскажу о ней, поскольку она объясняет часть темы.   -  person Adrian Maire    schedule 28.06.2017
comment
@AdrianMaire Я не думаю, что понимаю, вы имеете в виду, что хотите включить это в вопрос? Если да, то дерзайте ????????   -  person Curious    schedule 28.06.2017
comment
@AdrianMaire: Но там есть ответы на все ваши вопросы. memory_resource — это то, что вы получаете для достижения полиморфной функциональности выделения, предоставляемой через тип распределителя polymorphic_allocator.   -  person Nicol Bolas    schedule 28.06.2017
comment
@NicolBolas: включение является однонаправленным: Polymorphic_allocator является частью memory_resource, но memory_resource — это не только polymorphic_allocator. Я особенно сосредотачиваюсь на пулах памяти, поэтому есть полная глава о pool_options, synchronized_pool_resource, unsynchronized_pool_resource monotonic_buffer_resource, memory_resource class.. и только polymorphic_allocator наполовину дан ответ. С другой стороны, вы закрылись из-за повторяющегося вопроса, а не повторяющегося ответа (помните, что люди не знают ответа и выполняют поиск по вопросу)   -  person Adrian Maire    schedule 28.06.2017


Ответы (1)


polymorphic_allocator предназначен для того, чтобы у вас был распределитель, поведение которого динамически определяется во время выполнения.

Единственный способ создать polymorphic_allocator:

  1. Создан по умолчанию, и в этом случае он использует возвращаемое значение std::pmr::get_default_resource(), которое является memory_resource*.

  2. Передайте memory_resource*.

  3. скопировать с другого polymorphic_allocator.

Таким образом, точка настройки для polymorphic_allocator заключается в создании класса, наследуемого от memory_resource, и реализации его методов, или с использованием одного из предварительно объявленных memory_resource, определенных в std::pmr: (un)synchronized_pool_resource и monotonic_buffer_resource как типы или std::pmr::new_delete_resource()/std::pmr::null_memory_resource().

Предположим, вы хотите, чтобы ваша память была выделена с использованием стратегии, отличной от 5, представленной в std::pmr. Затем вы создаете класс, наследуемый от std::pmr::memory_resource, и передаете его контейнеру, который использует класс polymorphic_allocator.

person Yakk - Adam Nevraumont    schedule 29.08.2018