STL 컨테이너를 직접 구현하다보면 STL 컨테이너의 constructor에 allocator가 있다는 사실을 알게된다. 그런데 정작 컨테이너를 직접 사용하면서 allocator를 사용해본 경험은 아마 이 글을 읽는 대부분이 없을 것이다. C++에서 allocator는 어떤 역할을 하는 녀석일까?
Allocator
이다. Allocator를 통해서 유저는 STL container 내부의 코드를 변경하지 않고 단순히 Allocator만을 제공함으로써 컨테이너에 대한 메모리 모델을 직접 정의할 수 있다. 이를 활용하는 대표적으로 Memory pool, Garbage Collector 를 STL 컨테이너에 적용하기 위해서 활용한다.
std::allocator
이다.std::allocator
는 C++ Standard에서 정의한 Allocator의 인터페이스를 모두 갖춘 템플릿 클래스이다. memory pooling이나 garbage collecting 등 특별한 메커니즘이 적용된 것이 아닌, operator new, operator delete
만을 이용한 allocate()
deallocate()
가 적용되어있다.std::allocator
는 무상태 클래스로 같은 클래스의 다른 인스턴스를 적용해도 동일한 동작이 보장된다.https://en.cppreference.com/w/cpp/named_req/Allocator
구현되어야할 메소드 중 가장 중요한건 아래 두 메소드이다.
pointer allocate(size_type n)
void deallocate(pointer p, size_type n)
allocate()
에 의해서 할당된 storage에 해당하는 포인터 p에 대해서 할당을 해제한다. 이 때, n의 경우 반드시 이전 할당 당시에 건내받은 n과 일치해야한다.아래는 위 요구 조건에 맞춰 메모리풀을 적용한 allocator를 적용하는 예시를 담은 블로그이다.
https://www.sjbrown.co.uk/posts/pooled-allocators-for-the-stl/
https://www.sjbrown.co.uk/posts/pooled-allocators-for-the-stl/