allocator — std::allocator

allocator — std::allocator

std::allocator 클래스 템플릿은 사용자가 지정한 할당자가 없을 때 모든 표준 라이브러리 컨테이너가 사용하는 기본 할당자예요.

기본 할당자는 **무상태(stateless)**예요. 즉 주어진 할당자의 모든 인스턴스는 서로 교환 가능하고, 비교 시 같다고 판정되며, 같은 할당자의 다른 인스턴스가 할당한 메모리도 해제할 수 있어요.

출처: cppreference

본문

// <memory> 헤더
template< class T >
struct allocator;                       // (1)

template<>
struct allocator<void>;                 // (2) C++17에서 deprecated, C++20에서 제거
#include <vector>
#include <memory>

// 명시하지 않으면 기본 할당자 사용
std::vector<int> v;                     // std::allocator<int>
std::vector<int, std::allocator<int>> v2; // 명시적으로도 가능

주요 멤버

멤버 설명
value_type T
allocate(n) n개의 T를 저장할 메모리 할당
deallocate(p, n) 할당한 메모리 해제
max_size() 할당 가능한 최대 개수
address(x) 객체의 주소
construct(p, args...) 배치 생성 (C++20에서 제거)
destroy(p) 파괴 (C++20에서 제거)
rebind<U> U 타입용 할당자로 변경
std::allocator<int> a;
int* p = a.allocate(5);         // 5개 int 공간
for (int i = 0; i < 5; ++i) p[i] = i;
a.deallocate(p, 5);             // 해제

특징

  • 기본 할당자는 내부적으로 ::operator new/::operator delete(전역 할당 함수)를 사용해요 (또는 new/delete의 커스텀 전역 오버로드를 통해 커스터마이즈 가능).
  • std::allocator<T>에 대한 allocator_traits<allocator<T>>가 표준 구현을 제공해요.
  • C++20부터 construct/destroy 멤버는 제거되고 allocator_traits의 기본 구현으로 대체됐어요.
// 사용자 정의 전역 new/delete를 바꾸면 기본 할당자 동작도 바뀜
void* operator new(std::size_t n) {
    // 커스텀 풀
}

std::allocator는 가볍고 무상태라 기본값으로 안전해요. 성능 최적화나 특수 메모리 정책이 필요할 때만 사용자 정의 할당자를 고려하면 돼요.

더 알아보기 (Learn more)

cppreference