(C++ : IOCP-18) STL Allocator

Posted by : at

Category : Cpp   iocp



  • 파편화, 재사용 문제를 해결하기 전, STL도 메모리할당을 별도로할 수 있을까?
  • STL 생성자를 따라가보면 Allocator를 받아줌을 알수 있다.
// ...

// CLASS TEMPLATE vector
template <class _Ty, class _Alloc = allocator<_Ty>>
class vector { // varying size array of values
private:

// ...

STL에서 사용가능한 Allocator를 만들어보자.

template<typename T>
class StlAllocator
{
public:
    // 일단 value_type을 STLAllocator에 저장해둔다.
	using value_type = T;

	StlAllocator() { }

    // 복사생성자의 형식을 만들어둔다.
	template<typename Other>
	StlAllocator(const StlAllocator<Other>&) { }

    // 실질적으로 데이터를 할당 헤제하는 함수를 생성한다.(xalloc, xrelease는 이전강의 참조)
	T* allocate(size_t count)
	{
		const int32 size = static_cast<int32>(count * sizeof(T));
		return static_cast<T*>(xalloc(size));
	}

	void deallocate(T* ptr, size_t count)
	{
		xrelease(ptr);
	}
};
// ...

#ifdef _DEBUG
#define xalloc(size)		StompAllocator::Alloc(size)
#define xrelease(ptr)		StompAllocator::Release(ptr)
#else

// ...

사용의 편의성을 위해서 매크로를 만들어 사용하자

// ...

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>;

// String도 Allocator를 할당
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>>;

About Taehyung Kim

안녕하세요? 8년차 현업 C++ 개발자 김태형이라고 합니다. 😁 C/C++을 사랑하며 다양한 사람과의 협업을 즐깁니다. ☕ 꾸준한 자기개발을 미덕이라 생각하며 노력중이며, 제가 얻은 지식을 홈페이지에 정리 중입니다. 좀 더 상세한 제 이력서 혹은 Private 프로젝트 접근 권한을 원하신다면 메일주세요. 😎

Star
Useful Links