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