참고: EASTL, https://jacking75.github.io/Cpp_EASTL/
CUSTOM ALLOCATOR : https://www.youtube.com/watch?v=pP15kDeXJU0
https://www.youtube.com/watch?v=kSWfushlvB8
std 의 container들에는 Allocator(할당자)가 존재합니다.
이는 실질적인 container 들의 메모리를 관리합니다.
기본적으로 표준의 allocator를 사용하게 되고, 사용자가 직접 선언해준다면
자신이 직접만든 allocator를 사용할 수 있습니다.
std::vector<int, cAlloc<int>> v;
위는 인스턴스 풀, 메모리 풀, 그리고 EASTL 의 custom allocator 등 많은 방면으로 바꿔 사용할 수 있습니다.
자신이 만든 클래스 템플릿을 커스텀 할당자로 사용하려면 특정 인터페이스를 만족해야 합니다.
template <typename T>
class my_allocator
{
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef T* pointer;
typedef const T* const_pointer;
typedef T& reference;
typedef const T& const_reference;
typedef T value_type;
template <class U>
struct rebind { typedef allocator<U> other; };
// remaining member functions described below
// ...
};
실제로 필요한건 value_type 과 rebind 이며, 그 외의 typedef 에 대한건 원하지 않는다면 제공하지 않을 수 있습니다.
{ pointer(T*) 와 reference(T&)는 제공해야 한다고 문서에는 작성되어 있는데, 위의 custom allocator 동영상을 기준으로 작성하고 있으며 동영상 제작자는 원하지 않는다면 제공하지 않아도 된다고 하였습니다. }
그 외의 만족해야할 옵션엔 다음이 있습니다.
1. 템플릿으로 만들어야 하며 템플릿 매개변수에는 실제로 사용할 객체의 타입 T를 사용한다.
2. 비정적 데이터 멤버를 가질 수 없다.
3. allocate / deallocate 함수를 가져야 하며 allocate 의 인자로 객체 T 가 필요한 갯수를 넘겨야 한다.
또한 반환하는 포인터는 void*가 아닌 실제 포인터 (T*) 가 돼야 한다.
다음 글 부턴 실제로 하나씩 작성하며 설명을 작성해두겠습니다.
기본으로 알아야 할 정보 :
https://en.cppreference.com/w/cpp/types/ptrdiff_t ( ptrdiff_t )
https://docs.microsoft.com/ko-kr/cpp/standard-library/allocator-base-class?view=vs-2019
( 기본 STL allocator 의 형식 정의와 멤버 함수들 )
https://docs.roguewave.com/sourcepro/11.1/html/toolsug/11-6.html
( Rogue Wave 의 Custom Allocator Online Document )
'C++ > STL' 카테고리의 다른 글
remove-erase 고찰 (0) | 2021.05.03 |
---|---|
STL) 나만의 Allocator( 할당자 ) 만들기 - 2 (0) | 2019.04.17 |
std::list::splice (0) | 2019.04.12 |
STL) 반복자 어댑터 ( Iterator Adaptor ) (0) | 2019.04.12 |
STL) 분할, 정렬, 힙에 대한 추가 연산들 (stable_*, is_*, is_*_until) (0) | 2019.02.20 |