Namespaces
Variants

Standard library header <memory_resource> (C++17)

From cppreference.net
Standard library headers

목차

클래스

네임스페이스 std::pmr 에 정의됨
생성 시 사용된 std::pmr::memory_resource 를 기반으로 런타임 다형성을 지원하는 할당자
(클래스 템플릿)
메모리 리소스를 캡슐화하는 클래스들을 위한 추상 인터페이스
(클래스)
풀 리소스에 대한 생성자 옵션 집합
(클래스)
서로 다른 블록 크기의 풀에서 할당을 관리하는 스레드 안전한 std::pmr::memory_resource
(클래스)
서로 다른 블록 크기의 풀에서 할당을 관리하는 스레드 안전하지 않은 std::pmr::memory_resource
(클래스)
리소스가 파괴될 때만 할당된 메모리를 해제하는 특수 목적의 std::pmr::memory_resource
(클래스)

함수

네임스페이스 std::pmr 에 정의됨
전역 operator new operator delete 를 사용하여 메모리를 할당 및 해제하는 정적 프로그램 전체 std::pmr::memory_resource 를 반환함
(함수)
할당을 수행하지 않는 정적 std::pmr::memory_resource 를 반환함
(함수)
기본 std::pmr::memory_resource 를 가져옴
(함수)
기본 std::pmr::memory_resource 를 설정함
(함수)

시놉시스

namespace std::pmr {
  // 클래스 memory_resource
  class memory_resource;
  bool operator==(const memory_resource& a, const memory_resource& b) noexcept;
  // 클래스 템플릿 polymorphic_allocator
  template<class Tp> class polymorphic_allocator;
  template<class T1, class T2>
    bool operator==(const polymorphic_allocator<T1>& a,
                    const polymorphic_allocator<T2>& b) noexcept;
  // 전역 메모리 리소스
  memory_resource* new_delete_resource() noexcept;
  memory_resource* null_memory_resource() noexcept;
  memory_resource* set_default_resource(memory_resource* r) noexcept;
  memory_resource* get_default_resource() noexcept;
  // 풀 리소스 클래스들
  struct pool_options;
  class synchronized_pool_resource;
  class unsynchronized_pool_resource;
  class monotonic_buffer_resource;
}

클래스 std::pmr::memory_resource

namespace std::pmr {
  class memory_resource {
    static constexpr size_t max_align = alignof(max_align_t);   // 설명 전용
  public:
    memory_resource() = default;
    memory_resource(const memory_resource&) = default;
    virtual ~memory_resource();
    memory_resource& operator=(const memory_resource&) = default;
    void* allocate(size_t bytes, size_t alignment = max_align);
    void deallocate(void* p, size_t bytes, size_t alignment = max_align);
    bool is_equal(const memory_resource& other) const noexcept;
  private:
    virtual void* do_allocate(size_t bytes, size_t alignment) = 0;
    virtual void do_deallocate(void* p, size_t bytes, size_t alignment) = 0;
    virtual bool do_is_equal(const memory_resource& other) const noexcept = 0;
  };
}

클래스 템플릿 std::pmr::polymorphic_allocator

namespace std::pmr {
  template<class Tp = byte> class polymorphic_allocator {
    memory_resource* memory_rsrc;       // 설명용으로만 사용
  public:
    using value_type = Tp;
    // 생성자들
    polymorphic_allocator() noexcept;
    polymorphic_allocator(memory_resource* r);
    polymorphic_allocator(const polymorphic_allocator& other) = default;
    template<class U>
      polymorphic_allocator(const polymorphic_allocator<U>& other) noexcept;
    polymorphic_allocator& operator=(const polymorphic_allocator&) = delete;
    // 멤버 함수들
    Tp* allocate(size_t n);
    void deallocate(Tp* p, size_t n);
    void* allocate_bytes(size_t nbytes, size_t alignment = alignof(max_align_t));
    void deallocate_bytes(void* p, size_t nbytes, size_t alignment = alignof(max_align_t));
    template<class T> T* allocate_object(size_t n = 1);
    template<class T> void deallocate_object(T* p, size_t n = 1);
    template<class T, class... CtorArgs>
      T* new_object(CtorArgs&&... ctor_args);
    template<class T> void delete_object(T* p);
    template<class T, class... Args>
      void construct(T* p, Args&&... args);
    template<class T>
      void destroy(T* p); // 사용 중단됨
    polymorphic_allocator select_on_container_copy_construction() const;
    memory_resource* resource() const;
  };
}

클래스 std::pmr::pool_options

namespace std::pmr {
  struct pool_options {
    size_t max_blocks_per_chunk = 0;
    size_t largest_required_pool_block = 0;
  };
}

클래스 std::pmr::synchronized_pool_resource

namespace std::pmr {
  class synchronized_pool_resource : public memory_resource {
  public:
    synchronized_pool_resource(const pool_options& opts, memory_resource* upstream);
    synchronized_pool_resource()
        : synchronized_pool_resource(pool_options(), get_default_resource()) {}
    explicit synchronized_pool_resource(memory_resource* upstream)
        : synchronized_pool_resource(pool_options(), upstream) {}
    explicit synchronized_pool_resource(const pool_options& opts)
        : synchronized_pool_resource(opts, get_default_resource()) {}
    synchronized_pool_resource(const synchronized_pool_resource&) = delete;
    virtual ~synchronized_pool_resource();
    synchronized_pool_resource& operator=(const synchronized_pool_resource&) = delete;
    void release();
    memory_resource* upstream_resource() const;
    pool_options options() const;
  protected:
    void* do_allocate(size_t bytes, size_t alignment) override;
    void do_deallocate(void* p, size_t bytes, size_t alignment) override;
    bool do_is_equal(const memory_resource& other) const noexcept override;
  };
}

클래스 std::pmr::unsynchronized_pool_resource

namespace std::pmr {
  class unsynchronized_pool_resource : public memory_resource {
  public:
    unsynchronized_pool_resource(const pool_options& opts, memory_resource* upstream);
    unsynchronized_pool_resource()
        : unsynchronized_pool_resource(pool_options(), get_default_resource()) {}
    explicit unsynchronized_pool_resource(memory_resource* upstream)
        : unsynchronized_pool_resource(pool_options(), upstream) {}
    explicit unsynchronized_pool_resource(const pool_options& opts)
        : unsynchronized_pool_resource(opts, get_default_resource()) {}
    unsynchronized_pool_resource(const unsynchronized_pool_resource&) = delete;
    virtual ~unsynchronized_pool_resource();
    unsynchronized_pool_resource& operator=(const unsynchronized_pool_resource&) = delete;
    void release();
    memory_resource* upstream_resource() const;
    pool_options options() const;
  protected:
    void* do_allocate(size_t bytes, size_t alignment) override;
    void do_deallocate(void* p, size_t bytes, size_t alignment) override;
    bool do_is_equal(const memory_resource& other) const noexcept override;
  };
}

클래스 std::pmr::monotonic_buffer_resource

namespace std::pmr {
  class monotonic_buffer_resource : public memory_resource {
    memory_resource* upstream_rsrc;     // 설명 전용
    void* current_buffer;               // 설명 전용
    size_t next_buffer_size;            // 설명 전용
  public:
    explicit monotonic_buffer_resource(memory_resource* upstream);
    monotonic_buffer_resource(size_t initial_size, memory_resource* upstream);
    monotonic_buffer_resource(void* buffer, size_t buffer_size, memory_resource* upstream);
    monotonic_buffer_resource()
      : monotonic_buffer_resource(get_default_resource()) {}
    explicit monotonic_buffer_resource(size_t initial_size)
      : monotonic_buffer_resource(initial_size, get_default_resource()) {}
    monotonic_buffer_resource(void* buffer, size_t buffer_size)
      : monotonic_buffer_resource(buffer, buffer_size, get_default_resource()) {}
    monotonic_buffer_resource(const monotonic_buffer_resource&) = delete;
    virtual ~monotonic_buffer_resource();
    monotonic_buffer_resource& operator=(const monotonic_buffer_resource&) = delete;
    void release();
    memory_resource* upstream_resource() const;
  protected:
    void* do_allocate(size_t bytes, size_t alignment) override;
    void do_deallocate(void* p, size_t bytes, size_t alignment) override;
    bool do_is_equal(const memory_resource& other) const noexcept override;
  };
}