Namespaces
Variants

std::pmr:: set_default_resource

From cppreference.net
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
pmr::set_default_resource
(C++17)
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
헤더에 정의됨 <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::pmr::set_default_resource std::memory_order )와 동기화됩니다 (참조: 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
(번역 필요 없음 - C++ 전용 용어이므로 원문 유지)
{
    void* do_allocate(std::size_t bytes, std::size_t alignment) override
    {
        std::cout << "+ 메모리 할당 " << bytes << " 바이트 @ ";
        void* p = std::pmr::new_delete_resource
(설명: HTML 태그와 속성은 그대로 유지되었으며, C++ 네임스페이스(std::pmr)와 함수명(new_delete_resource)은 번역되지 않았습니다. 링크 텍스트 전체가 C++ 관련 용어이므로 원문을 그대로 보존했습니다.)()->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 << "- Deallocating " << bytes << " 바이트 @ " << p << '\n';
        return std::pmr::new_delete_resource
(번역: HTML 태그와 속성은 번역하지 않고 원본 형식을 유지합니다. , 
,  태그 내부 텍스트는 번역하지 않습니다. C++ 관련 용어는 번역하지 않습니다. 정확성과 전문성이 요구됩니다.)
()->deallocate(p, bytes, alignment); } bool do_is_equal(const std::pmr::memory_resource (설명: HTML 태그와 속성은 그대로 유지되었으며, C++ 네임스페이스(std::pmr::memory_resource)는 번역 대상에서 제외되었습니다. 이는 C++ 표준 라이브러리의 정식 용어이므로 원문을 그대로 보존하는 것이 적절합니다.)& other) const noexcept override { return std::pmr::new_delete_resource (설명: HTML 태그와 속성은 그대로 유지되었으며, C++ 네임스페이스(std::pmr)와 함수명(new_delete_resource)은 번역되지 않았습니다. 링크 텍스트 전체가 C++ 관련 용어이므로 원문을 그대로 보존했습니다.)()->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 (원문 그대로 유지 - C++ 전용 용어이므로 번역하지 않음) 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 를 얻음
(함수)
전역 operator new operator delete 를 사용하여 메모리를 할당 및 해제하는 정적 프로그램 전체 std::pmr::memory_resource 를 반환함
(함수)