C++ allocator 가볍게 알아보기
C++ 의 Allocator는 무엇인지 알아보자.
C++ STL의 컨테이너 재구현 중 std::allocator 라는 녀석을 발견했다. allocator 는 C++ 에서 어떤 역할을 하는 것일까? 가볍게 같이 알아보자.
Allocator?
STL 컨테이너를 직접 구현하다보면 STL 컨테이너의 constructor에 allocator가 있다는 사실을 알게된다. 그런데 정작 컨테이너를 직접 사용하면서 allocator를 사용해본 경험은 아마 이 글을 읽는 대부분이 없을 것이다. C++에서 allocator는 어떤 역할을 하는 녀석일까?
allocator 가 등장한 배경
- C++ STL을 설계할 당시, STL 컨테이너들이 메모리 모델에 대해 독립적으로 작동할 필요가 제기되었다. 이를 구현하기 위해서 등장한 것이
Allocator
이다. Allocator를 통해서 유저는 STL container 내부의 코드를 변경하지 않고 단순히 Allocator만을 제공함으로써 컨테이너에 대한 메모리 모델을 직접 정의할 수 있다. 이를 활용하는 대표적으로 Memory pool, Garbage Collector 를 STL 컨테이너에 적용하기 위해서 활용한다.
default allocator
- STL 컨테이너를 활용하면서 우리가 Allocator에 대해서 신경을 쓰지 않아도 됐던 이유는 유저가 컨테이너를 생성할 당시 별도로 allocator를 지정하지 않는다면 기본적으로 Default allocator를 사용하기 때문이다. 이 deault allocator 는
std::allocator
이다. std::allocator
는 C++ Standard에서 정의한 Allocator의 인터페이스를 모두 갖춘 템플릿 클래스이다. memory pooling이나 garbage collecting 등 특별한 메커니즘이 적용된 것이 아닌,operator new, operator delete
만을 이용한allocate()
deallocate()
가 적용되어있다.- 그런 이유에서
std::allocator
는 무상태 클래스로 같은 클래스의 다른 인스턴스를 적용해도 동일한 동작이 보장된다.
custom allocator
- 앞서 설명했듯, STL 컨테이너에 대해서 메모리 정책을 적용하고 싶다면, 그에 맞는 allocator를 전달하면 된다. 그렇다면, Allocator는 어떻게 만드는 것일까?
- 우선 C++ reference를 참고하면 다음과 같은 요구조건이 있다.
https://en.cppreference.com/w/cpp/named_req/Allocator
- 구현되어야할 메소드 중 가장 중요한건 아래 두 메소드이다.
pointer allocate(size_type n)
- Allocator의 템플릿 타입을 T라고 할 때, T[n] 에 적합한 메모리를 할당한다. 이 때 array elements에 대해서 construction은 일어나지 않는다.
- 컨테이너 내부의 메모리 할당에 관여하는 함수!
void deallocate(pointer p, size_type n)
- 이전에
allocate()
에 의해서 할당된 storage에 해당하는 포인터 p에 대해서 할당을 해제한다. 이 때, n의 경우 반드시 이전 할당 당시에 건내받은 n과 일치해야한다. - 이전에 allocator에 의해 할당된 메모리를 회수하는 함수!
- 이전에
- 아래는 위 요구 조건에 맞춰 메모리풀을 적용한 allocator를 적용하는 예시를 담은 블로그이다.
- https://www.sjbrown.co.uk/posts/pooled-allocators-for-the-stl/
reference
https://www.sjbrown.co.uk/posts/pooled-allocators-for-the-stl/