std::pmr:: set_default_resource
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Определено в заголовочном файле
<memory_resource>
|
||
|
std::
pmr
::
memory_resource
*
set_default_resource
(
std::
pmr
::
memory_resource
*
r
)
noexcept
;
|
(начиная с C++17) | |
Если r не является нулевым указателем, устанавливает указатель на ресурс памяти по умолчанию в 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 (Примечание: Текст не требует перевода, так как содержит только HTML-разметку и C++ специфичные термины (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 (Примечание: В данном случае переводить нечего, так как текст состоит только из HTML-разметки и C++ термина `std::size`, который по условиям перевода не подлежит переводу)(buffer)}; std::cout << "Создание вектора v...\n"; std::pmr::vector (Примечание: Текст не требует перевода, так как содержит только HTML-разметку и C++ специфичные термины (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
Смотрите также
|
(C++17)
|
получает ресурс памяти по умолчанию
std::pmr::memory_resource
(функция) |
|
(C++17)
|
возвращает статический ресурс памяти в масштабах программы
std::pmr::memory_resource
который использует глобальные
operator new
и
operator delete
для выделения и освобождения памяти
(функция) |