메모리를 관리하기 위해서 일반적으로 new와 delete를 사용한다. 하지만 메모리를 사용하고 반납하는 과정에서 조각난 공간들이 생기게 되고 그렇게 되면 분명 빈 메모리가 있음에도 제대로 사용할 수 없는 상황이 생기게 된다. 이런 상황을 메모리 단편화라고 한다. 이러한 상황을 예방할 수 있는 메모리풀을 구현하기 위한 초석으로 간단하게 new와 delete를 새롭게 만들어 보자.
Allocator.h
#pragma once
//------------------
// BaseAllocator
//------------------
class BaseAllocator
{
public:
static void* Alloc(int32 size);
static void Release(void* ptr);
};
Allocator.cpp
#include "pch.h"
#include "Allocator.h"
//------------------
// BaseAllocator
//------------------
void* BaseAllocator::Alloc(int32 size)
{
return malloc(size);
}
void BaseAllocator::Release(void* ptr)
{
free(ptr);
}
지금 당장은 할당하고 해제해주는 코드만 있다.
Memory.h
#pragma once
#include "Allocator.h"
template<typename Type, typename... Args>
Type* Xnew(Args&&... args)
{
Type* memory = static_cast<Type*>(Xalloc(sizeof(Type)));
//placement new
new(memory)Type(forward<Args>(args)...);
return memory;
}
template<typename Type>
void Xdelete(Type* obj)
{
obj->~Type();
Xrelease(obj);
}
new와 delete는 메모리를 할당한 후 객체의 생성자를 알아서 호출해준다. 하지만 위의 코드는 단순히 메모리만 할당해 주기 때문에 생성자를 호출해 주어야하고 이를 위해서 placement new를 사용한다. 이미 할당되어 있는 메모리에 생성자를 호출해주는 것이다. new(할당된 메모리) 생성자(인자, ...)이런식으로 사용한다. 인자의 개수는 정해져있지 않으므로 가변인자를 사용한다.
CoreMacro.h
//------------------
// Memory
//------------------
#ifdef _DEBUG
#define Xalloc(size) BaseAllocator::Alloc(size)
#define Xrelease(ptr) BaseAllocator::Release(ptr)
#else
#define Xalloc(size) BaseAllocator::Alloc(size)
#define Xrelease(ptr) BaseAllocator::Release(ptr)
#endif
간편하게 사용하기 위해 메크로도 만들어두었다.
'서버 > 메모리 관리' 카테고리의 다른 글
6. Memory Pool #1 (0) | 2024.08.20 |
---|---|
5. STL Allocator (0) | 2024.08.16 |
4. Stomp Allocator (0) | 2024.08.16 |
2. 스마트포인터 (0) | 2024.08.11 |
1. Reference Counting (0) | 2024.08.09 |