std::pmr:: set_default_resource
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
헤더에 정의됨
<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 태그와 속성은 번역하지 않고 원본 형식을 유지합니다. , ,
()->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
참고 항목
|
(C++17)
|
기본
std::pmr::memory_resource
를 얻음
(함수) |
|
(C++17)
|
전역
operator new
와
operator delete
를 사용하여 메모리를 할당 및 해제하는 정적 프로그램 전체
std::pmr::memory_resource
를 반환함
(함수) |