728x90

이 글은 [인프런-게임서버 만들기 by rookiss]를 내용을 토대로 개인적으로 학습한 내용을 종합하여 정리 했습니다.

 

 

앞서 [CustomAllocator] 1단계_new, delete overloading에서 new, delete 오버로딩 하는 방법에 대해 학습했습니다.

 

오버로딩 하는 방법에는 크게 두 가지가 있습니다.

- 전역 오버로딩

- 클래스별 오버로딩

 

전역 오버로딩의 경우 모든 new, delete 연산자에 적용 되므로 위험한 방식 입니다. 그렇다면 메모리 관리를 하기 위해서는 클래스별 오버로딩을 쓰면 될까요? 가능합니다. 하지만 메모리 관리를 좀더 범용적으로 하려면 클래스별로 오버로딩을 작성하는 일도 여간 귀찮은 작업일 것 입니다. 매크로 등을 이용해서 조금은 개선 시킬 수 있지만요.

 

그래서 여기서는 저희만의 new, delete를 정의해서 사용하는 방법을 소개합니다. xnew, xdelete로 구현해 봅시다.

 

template<typename Type, typename... Args>
Type* xnew(Args&&... args)
{
	Type* memory = static_cast<Type*>( ::malloc(sizeof(Type) ); // 1단계 메모리 할당

	new(memory)Type(::forward<Args>(args)...); // 2단계 생성자 호출

	return memory; // 3단계 메모리 주소 반환
}

template<typename Type>
void xdelete(Type* obj)
{
	obj->~Type();    // 1단계 소멸자 호출
	::free(obj); // 2단계 메모리 반환
}

new, delete 동작 방식을 이해하고 있다면 위 코드를 이해하는 큰 어려움이 없습니다. 템플릿 코드로 바꿔준게 전부니까요. 이 코드를 이해 하기 위해서 new, delete 동작 방식 이외에 선수 지식이라면 템플릿 기초 문법, 템플릿 가변 매개변수, 전달참조(+forward) 정도 입니다. 위 코드가 이해되지 않는다면 해당 내용을 먼저 학습하고 위 코드를 보시면 어렵지 않게 이해할 수 있습니다.

 

본격적으로 메모리풀링을 하기 앞서 new, delete 연산자 흐름 가로채서 custom new, xdelete를 정의 했습니다. 이제 다음 단계에서 위 코드에 보이는 malloc 과 free 부분 역시 저희만의 메모리 할당기/해제기를 만들어 대체 해보도록 합시다.

728x90

'Programming Language > C++' 카테고리의 다른 글

CustomAllocator] 4단계_StompAllocator_1  (0) 2022.02.14
CustomAllocator] 3단계_메모리 페이징  (0) 2022.02.14
[CustomAllocator] 1단계_new, delete overloading  (0) 2022.02.13
::/스코프 지정자  (0) 2022.02.11
std::function  (0) 2022.02.10

+ Recent posts