allocator_traits — std::allocator_traits

allocator_traits — std::allocator_traits

std::allocator_traits 클래스 템플릿은 **할당자(Allocator)**의 다양한 속성에 접근하는 표준화된 방법을 제공해요.

표준 컨테이너와 다른 표준 라이브러리 구성 요소들은 이 템플릿을 통해 할당자에 접근해요. 덕분에 사용자가 제공한 std::allocator_traits 특수화가 필요한 기능을 모두 구현하기만 하면, 어떤 클래스 타입도 할당자로 쓸 수 있어요.

출처: cppreference

본문

// <memory> 헤더, C++11
template< class Alloc >
struct allocator_traits;

주요 API

allocator_traits<Alloc>은 다음을 제공해요.

멤버 설명
allocator_type 할당자 타입
value_type 할당 대상 값 타입
pointer, const_pointer 포인터 타입
size_type, difference_type 크기·차이 타입
allocate(alloc, n) n개 원소 할당
deallocate(alloc, p, n) 해제
construct(alloc, p, args...) 배치 생성
destroy(alloc, p) 파괴
max_size(alloc) 최대 크기
rebind_alloc<U> 다른 타입으로 재바인딩
#include <memory>

template<typename Alloc>
typename std::allocator_traits<Alloc>::pointer
allocate_n(Alloc& a, std::size_t n) {
    return std::allocator_traits<Alloc>::allocate(a, n);
}

std::allocator<int> a;
int* p = allocate_n(a, 10);
std::allocator_traits<std::allocator<int>>::deallocate(a, p, 10);

특징

  • 표준 컨테이너(std::vector, std::map 등)는 할당자를 직접 사용하지 않고 항상 allocator_traits를 통해 사용해요.
  • 덕분에 최소한의 인터페이스만 가진 사용자 정의 할당자도 만들 수 있어요. allocator_traits가 나머지를 채워줘요.
  • construct, destroy는 C++20에서 삭제되고, 애초에 이들 멤버의 기본 구현이 allocator_traits에 있어요.
// 최소한의 할당자 — 나머지는 allocator_traits 기본 구현 활용
template<class T>
struct MyAlloc {
    using value_type = T;
    MyAlloc() = default;
    T* allocate(std::size_t n) { return static_cast<T*>(::operator new(n*sizeof(T))); }
    void deallocate(T* p, std::size_t) { ::operator delete(p); }
};

allocator_traits를 이해하면 자신만의 할당자를 만들고 커스텀 메모리 정책(풀, 아레나 등)을 컨테이너에 적용할 수 있어요.

더 알아보기 (Learn more)

cppreference