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 에서 스레드 안전하게 할당

더 알아보기 (Learn more)

cppreference