MMOServer

ObjectPooling(C++)

이야기prog 2025. 3. 29. 23:56
#pragma once
#include "MemoryPool.h"
#include "Types.h"

template<typename Type>
class ObjectPool {
public:
	template<typename... Args>
	static Type* Pop(Args&&... args) {
		Type* memory = reinterpret_cast<Type*>(MemoryHeader::AttachHeader(s_pool.Pop(), s_allocSize));
		new(memory)Type(std::forward<Args>(args)...);
		return memory;

	}
	static void Push(Type* ptr) {
		ptr->~Type();
		s_pool.Push(MemoryHeader::DetachHeader(ptr));
	}

	template<typename... Args>
	static shared_ptr<Type> MakeShared(Args&&... args) {
		shared_ptr<Type> ptr = { Pop(args...), Push };

		return ptr;
	}
private:
	static MemoryPool s_pool;
	static int32	  s_allocSize;
};

template<typename Type>
int32 ObjectPool<Type>::s_allocSize = sizeof(Type) + sizeof(MemoryHeader);

template<typename Type>
MemoryPool ObjectPool<Type>::s_pool{ s_allocSize };

메모리 풀링에서 특정 객체전용으로 풀링해주는 느낌이다.

메모리 풀링으로만 메모리를 할당해주면 나중에 메모리 오염시 어떤 객체가 오염을 일으키는지 찾기 어려울 수 있음.

그래서 객체전용으로 따로 풀링을 해준다면 디버그할 때 찾기 수월해진다.

'MMOServer' 카테고리의 다른 글

TCP(C++)  (0) 2025.04.01
SocketProgramming Basic(C++)  (0) 2025.04.01
MemoryPool(C++)  (0) 2025.03.28
SList(C++) 불완전  (0) 2025.03.28
메모리 관련  (0) 2025.03.27