Custom해서 만든 allocator를 stl에서도 쓸 수 있다. 약간의 코드 작업이 필요하다. 먼저 stl에서 기대하는 API를 구현한 allocator가 필요하다.
Allocator.h
/*---------------------
STL Allocator
---------------------*/
template<typename T>
class StlAllocator
{
public:
using value_type = T;
StlAllocator() {}
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*>(x_alloc(size));
}
void deallocate(T* ptr, size_t count)
{
x_release(ptr);
}
};
allocate, deallocate에서 count는 메모리 사이즈가 아니라 할당할 메모리 개수이다.
StlAllocator를 사용한 stl container들을 재정의한다.
CorePch.h
#pragma once
...
#include "Container.h"
...
Container.h
#pragma once
#include "Types.h"
#include "Allocator.h"
#include <vector>
#include <list>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <unordered_map>
#include <unordered_set>
using namespace std;
template<typename Type>
using Vector = vector<Type, StlAllocator<Type>>;
template<typename Type>
using List = list<Type, StlAllocator<Type>>;
template<typename Key, typename Type, typename Pred = less<Key>>
using Map = map<Key, Type, Pred, StlAllocator<pair<const Key, Type>>>;
template<typename Key, typename Pred = less<Key>>
using Set = set<Key, Pred, StlAllocator<Key>>;
template<typename Type>
using Deque = deque<Type, StlAllocator<Type>>;
template<typename Type, typename Container = Deque<Type>>
using Queue = queue<Type, Container>;
template<typename Type, typename Container = Deque<Type>>
using Stack = stack<Type, Container>;
template<typename Type, typename Container = Vector<Type>, typename Pred = less<typename Container::value_type>>
using PriorityQueue = priority_queue<Type, Container, Pred>;
using String = basic_string<char, char_traits<char>, StlAllocator<char>>;
using WString = basic_string<wchar_t, char_traits<wchar_t>, StlAllocator<wchar_t>>;
template<typename Key, typename Type, typename Hasher = hash<Key>, typename KeyEq = equal_to<Key>>
using HashMap = unordered_map<Key, Type, Hasher, KeyEq, StlAllocator<pair<const Key, Type>>>;
template<typename Key, typename Hasher = hash<Key>, typename KeyEq = equal_to<Key>>
using HashSet = unordered_set<Key, Hasher, KeyEq, StlAllocator<Key>>;
아래와 같이 사용하면 된다.
int main()
{
Vector<Knight> v;
HashMap<int32, Knight> map;
}
참조 : [C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버 - 인프런 | 강의 (inflearn.com)
Memory pool #2 (0) | 2021.09.23 |
---|---|
Memory pool (0) | 2021.09.15 |
Stomp allocator (0) | 2021.09.11 |
Allocator (0) | 2021.09.11 |
스마트 포인터 (0) | 2021.09.10 |
댓글 영역