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

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++14)
(C++11)
(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 : public std::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';
        return std::pmr::new_delete_resource()->deallocate(p, bytes, alignment);
    }
 
    bool do_is_equal(const std::pmr::memory_resource& other) const noexcept override
    {
        return std::pmr::new_delete_resource()->is_equal(other);
    }
};
 
int main()
{
    constexpr int 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 для выделения и освобождения памяти
(функция) [править]