Пространства имён
Варианты
Действия

std::pmr::set_default_resource

Материал из cppreference.com
< cpp‎ | memory
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования функциональности библиотеки (C++20)    
Управление динамической памятью
Программные утилиты
Поддержка сопрограмм(C++20)
Вариативные функции
Трёхстороннее сравнение (C++20)
(C++20)
(C++20)(C++20)(C++20)(C++20)(C++20)(C++20)
Общие утилиты
Дата и время
Функциональные объекты
Библиотека форматирования(C++20)
(C++11)
Операторы отношения (устарело в C++20)
Целочисленные функции сравнения
(C++20)(C++20)(C++20)    
(C++20)
Операции обмена и типа
(C++11)
(C++11)
(C++17)
Общие лексические типы
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
Элементарные преобразования строк
(C++17)
(C++17)
 
Динамическое управление памятью
no section name
Ограниченные алгоритмы неинициализированной памяти
no section name
Поддержка сбора мусора
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)



no section name
 
Определено в заголовочном файле <memory_resource>
std::pmr::memory_resource* set_default_resource(std::pmr::memory_resource* r)noexcept;
(начиная с C++17)

Если r не равно null, устанавливает указатель ресурса памяти по умолчанию в r; иначе устанавливает указатель ресурса памяти по умолчанию в std::pmr::new_delete_resource().

Указатель ресурса памяти по умолчанию используется некоторыми средствами, когда не указан явный ресурс памяти. Начальный указатель ресурса памяти по умолчанию это возвращаемое значение std::pmr::new_delete_resource.

Эта функция является потокобезопасной. Каждый вызов std::pmr::set_default_resourceсинхронизируется с (смотрите std::memory_order) последующими вызовами std::pmr::set_default_resource и std::pmr::get_default_resource.

[править]Возвращаемое значение

Возвращает предыдущее значение указателя ресурса памяти по умолчанию.

[править]Пример

#include <array>#include <cstddef>#include <cstdint>#include <iostream>#include <iterator>#include <memory_resource>#include <vector>   class noisy_allocator :publicstd::pmr::memory_resource{void* do_allocate(std::size_t bytes, std::size_t alignment) override {std::cout<<"+ Выделено "<< bytes <<" байт @ ";void* p =std::pmr::new_delete_resource()->allocate(bytes, alignment);std::cout<< p <<'\n';return p;}   void do_deallocate(void* p, std::size_t bytes, std::size_t alignment) override {std::cout<<"- Освобождено "<< bytes <<" байт @ "<< p <<'\n';returnstd::pmr::new_delete_resource()->deallocate(p, bytes, alignment);}   bool do_is_equal(conststd::pmr::memory_resource& other)constnoexcept override {returnstd::pmr::new_delete_resource()->is_equal(other);}};   int main(){constexprint push_back_limit{16}; noisy_allocator mem; std::pmr::set_default_resource(&mem);   {std::cout<<"Вход в область видимости #1 (без буфера в стеке)...\n";std::cout<<"Создание вектора v...\n";std::pmr::vector<std::uint16_t> v{1, 2, 3, 4};std::cout<<"v.data() @ "<< v.data()<<'\n';   std::cout<<"Запросить больше...\n";for(int i{0}; i != push_back_limit;++i){ v.push_back(i);std::cout<<"v.size(): "<< v.size()<<'\n';}std::cout<<"Выход из области видимости #1...\n";}   std::cout<<'\n';   {std::cout<<"Вход в область видимости #2 (с буфером в стеке)...\n";   std::uint8_t buffer[16];std::cout<<"Выделение буфера в стеке: "<< sizeof buffer <<" байт @ "<<static_cast<void*>(buffer)<<'\n';std::pmr::monotonic_buffer_resource mem_res{std::data(buffer), std::size(buffer)};   std::cout<<"Создание вектора v...\n";std::pmr::vector<std::uint16_t> v{{1, 2, 3, 4}, &mem_res };std::cout<<"v.data() @ "<< v.data()<<'\n';// эквивалентно адресу `buffer`   std::cout<<"Запросить больше...\n";for(int i{0}; i != push_back_limit;++i){ v.push_back(i);std::cout<<"v.size(): "<< v.size()<<'\n';}std::cout<<"Выход из области видимости #2...\n";}}

Возможный вывод:

Вход в область видимости #1 (без буфера в стеке)... Создание вектора v... + Выделено 8 байт @ 0x1f75c30 v.data() @ 0x1f75c30 Запросить больше... + Выделено 16 байт @ 0x1f75c50 - Освобождено 8 байт @ 0x1f75c30 v.size(): 5 v.size(): 6 v.size(): 7 v.size(): 8 + Выделено 32 байт @ 0x1f75c70 - Освобождено 16 байт @ 0x1f75c50 v.size(): 9 v.size(): 10 v.size(): 11 v.size(): 12 v.size(): 13 v.size(): 14 v.size(): 15 v.size(): 16 + Выделено 64 байт @ 0x1f75ca0 - Освобождено 32 байт @ 0x1f75c70 v.size(): 17 v.size(): 18 v.size(): 19 v.size(): 20 Выход из области видимости #1... - Освобождено 64 байт @ 0x1f75ca0   Вход в область видимости #2 (с буфером в стеке)... Выделение буфера в стеке: 16 байт @ 0x7fffbe9f8240 Создание вектора v... v.data() @ 0x7fffbe9f8240 Запросить больше... + Выделено 64 байт @ 0x1f75ca0 v.size(): 5 v.size(): 6 v.size(): 7 v.size(): 8 v.size(): 9 v.size(): 10 v.size(): 11 v.size(): 12 v.size(): 13 v.size(): 14 v.size(): 15 v.size(): 16 + Выделено 128 байт @ 0x1f75cf0 v.size(): 17 v.size(): 18 v.size(): 19 v.size(): 20 Выход из области видимости #2... - Освобождено 128 байт @ 0x1f75cf0 - Освобождено 64 байт @ 0x1f75ca0

[править]Смотрите также

получает значение по умолчанию std::pmr::memory_resource
(функция)[править]
возвращает статический общепрограммный std::pmr::memory_resource, который использует глобальные operator new и operator delete для выделения и освобождения памяти
(функция)[править]
close