memory_synchronized_pool_resource
memory_synchronized_pool_resource (std::pmr::synchronized_pool_resource)
<memory_resource> 헤더에 정의되어 있어요. 범용 메모리 리소스 클래스예요. 할당된 메모리를 소유하고, 일부 할당 블록에 대해 deallocate가 호출되지 않았어도 파괴 시 해제해요. 다중 스레드 접근을 외부 동기화 없이 지원해요. C++17부터 도입됐어요.
출처: cppreference
본문
class synchronized_pool_resource : public std::pmr::memory_resource;
(C++17부터)
클래스 std::pmr::synchronized_pool_resource는 다음 속성을 가진 범용 메모리 리소스 클래스예요.
- 할당된 메모리를 소유하고, 일부 할당 블록에 대해
deallocate가 호출되지 않았어도 파괴 시 해제해요. - 서로 다른 블록 크기의 요청을 처리하는 풀(pool)들의 집합으로 구성돼요. 각 풀은 균일한 크기의 블록으로 나뉘는 청크(chunk)들의 집합을 관리해요.
do_allocate호출은 요청 크기를 수용하는 가장 작은 블록을 제공하는 풀로 전달돼요.- 풀의 메모리가 고갈되면 그 풀의 다음 할당 요청은 업스트림 할당자에서 추가 청크를 할당해 풀을 보충해요. 얻은 청크 크기는 기하급수적으로 증가해요.
- 가장 큰 블록 크기를 초과하는 할당 요청은 업스트림 할당자에서 직접 처리돼요.
- 가장 큰 블록 크기와 최대 청크 크기는 생성자에
std::pmr::pool_options구조체를 전달해 조절할 수 있어요.
synchronized_pool_resource는 외부 동기화 없이 여러 스레드에서 접근할 수 있고, 동기화 비용을 줄이기 위해 스레드별 풀을 가질 수 있어요. 한 스레드에서만 접근한다면 unsynchronized_pool_resource가 더 효율적이에요.
멤버 함수
- (생성자):
synchronized_pool_resource생성 release: 할당된 모든 메모리를 업스트림에 해제upstream_resource: 업스트림 리소스 포인터 반환options: 풀 옵션 반환
std::pmr::pool_options opts; // 필요시 청크/풀 크기 조절
std::pmr::synchronized_pool_resource pool(opts);
std::pmr::vector<int> v(&pool); // pool 에서 스레드 안전하게 할당