본문으로 바로가기

STL) 나만의 Allocator( 할당자 ) 만들기 - 1

category C++/STL 2019. 4. 16. 00:47

참고: 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 )