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