이 프로젝트에서 메모리 할당을 관리하기 위해 커스텀 Allocator들을 만들었다. 그런데 c++에서 기본적으로 제공하는 STL에서는 내부에서 원래 있던 new, delete를 사용할 것이다. 즉 STL을 사용하면 우리가 힘들게 만든 Allocator로 메모리를 관리할 수 없다. 따라서 우리는 STL사용 시에도 커스텀 Allocator를 사용하도록 만들 것이다. 그것이 STL Allocator이다.
STL Allocator 만들기
사제 Allocator가 STL에 사용되기 위한 몇 가지 요구사항이 존재한다.
- tempalte를 사용할 것.
- using value_type 가 존재할 것.
- T* allocate(size_t count) 함수가 존재할 것.
- void deallocate(T* ptr, size_t count) 함수가 존재할 것.
- AllocatorName(const AllocatorName<Other>&) 생성자가 존재할 것.
그렇다면 위 요구사항에 맞춰 STL Allocator를 제작해보자.
template<typename T>
class STLAllocator
{
using value_type = T;
template<typename Other>
STLAllocator(const STLAllocator<Other>&) {}
T* allocate(size_t count)
{
const int32 size = static_cast<int32>(count * sizeof(T));
return static_cast<T*>(xxalloc(size));
}
void deallocate(T* ptr, size_t count)
{
xxrelease(ptr);
}
};
이제 이 STLAllocator 클래스를 STL에 적용시키는 일만 남았다.
STL Allocator 사용 방법
사실 STL에는 사용할 Allocator를 직접 선택할 수 있는 기능이 있다. vector 컨테이너의 경우 아래와 같은 코드로 선택할 수 있다.
vector<int, STLAllocator<int32>> vec;
위 코드는 int형 item을 가지고 STLAllocator라는 이름의 Allocator를 사용하는 vector를 선언하고 있다. 만약 ",STLAllocator<int32>" 를 지우면 자동으로 기본 Allocator가 사용된다.
그 외 컨테이너들도 물론 커스텀 Allocator를 사용할 수 있다. 그러나 상기한 vector 컨테이너와 약간씩 차이가 있다. 그 부분에 유념하며 사용해야 한다.
'프로젝트 > GameServerCore' 카테고리의 다른 글
ServerCore (0) | 2022.10.05 |
---|---|
네트워크 라이브러리 (0) | 2022.05.30 |
Stomp Allocator (0) | 2022.04.02 |
DeadLockProfiler (0) | 2022.02.18 |
ReadWrite Lock (0) | 2022.02.14 |