IT공부

[C++] Placement New

shine94 2024. 12. 18. 20:49

* Placement New

   표준 C++에서 제공하는 기능으로,

   새롭게 메모리에 할당하지 않고, 사용자가 제공한 특정 메모리 위치에 객체를 생성한다

 

#include <iostream>

class CTest
{
public:
	CTest() 
	{
		printf("CTest Constructor\n");
	}

	~CTest() 
	{
		printf("CTest Destructor\n");
	}

	int _x = 1;
	int _y = 1;
};

int main(void)
{
	// 일반 동적 할당
	//CTest* p1 = new CTest();
	//delete p1;

	// placement new 예제
	char buffer[sizeof(CTest)];		// 충분한 크기의 버퍼를 생성
	CTest* p2 = new (buffer) CTest();	// buffer 위치에 객체 생성

	// 수동으로 소멸자를 호출해야 함
	p2->~CTest();

	// 동적할당이 아니기 때문에 free할 필요 없음

	return 0;
}

 

(+) 만약 메모리를 malloc을 통해 동적으로 할당했다면, free를 호출해야 한다

void* buffer = std::malloc(sizeof(CTest));
CTest* p2 = new (buffer) CTest();
p2->~CTest();
std::free(buffer);		// 동적 할당된 메모리 해제

 


 

아래의 정리 내용은 Placement New가 스택 메모리나 미리 확보된 메모리를 사용하는 경우를 전제로 작성되었다

힙 메모리를 사용하는 동적 할당의 경우 일부 내용이 해당되지 않을 수 있다

 

 

* 특징

1. 기존 메모리를 재사용

   new 연산자를 사용해 메모리를 동적으로 할당하는 대신, 사용자가 제공한 메모리에서 객체를 생성한다

2. 소멸자 호출 필요

   Placement New로 생성한 객체를 자동으로 소멸되지 않는다

   따라서, 명시적으로 소멸자를 호출해야 한다

3. 힙 메모리 사용 없음

   메모리 할당 비용이 발생하지 않으므로, 성능을 최적화할 때 유용하다

 

* 메모리 풀(Memory Pool)이나 커스텀 메모리 관리를 구현할 때 자주 사용된다

 

* 메모리 풀에 사용했을 때의 장점

1. 성능 최적화

   동적 할당보다 빠르게 메모리를 재활용할 수 있다

2. 메모리 단편화 방지

   메모리 풀은 고정된 크기의 블록으로 단편화 문제를 줄일 수 있다

3. 예측 가능한 동작

   메모리 풀이 미리 할당된 메모리를 사용하므로, 메모리 사용 패턴을 예측 가능하게 만든다

 

* 실제 사용 사례

1. 게임 서버 개발

   많은 객체가 반복적으로 생성 및 소멸되는 경우(예: 몬스터, 총알 등)

2. 네트워크 프로그래밍

   패킷 처리와 같은 고빈도 작업

3. 실시간 시스템

   일정한 성능을 보장해야하는 시스템

 

* DB Connection Pool과 Memory Pool은 개념적으로 비슷

 

 

 

 

* 참고

   1. https://yuu5666.tistory.com/41

 

C++ - placement new

C++에 대한 문법을 공부하다가 Placement new라는 문법을 알게 되었다. 뭔가 어렵기도 하고 사용법이 다소 까다롭기도 하지만, 메모리 풀링을 할 때 중요하게 사용되는 문법이라고 한다. 먼저, Placemen

yuu5666.tistory.com

 

   2. https://velog.io/@dnjfs/C-%EC%A4%91%EA%B8%89-Placement-New

 

C++ 중급 - Placement New

placement new, 메모리 할당/해지, 생성자/소멸자 호출

velog.io

 

   3. https://woo-dev.tistory.com/217

 

[C++] placement new - 내가 원하는 메모리에 객체를 할당하고 싶다면

Placement new 내가 지정한 메모리에 객체를 초기화할 수 있을까? 메모리 풀을 만들다가 난항을 겪어 c++ 포럼에 질문을 남겼다가 새로운 기능을 알게 되었다. 그때 그때 생성할 객체의 타입이 달라

woo-dev.tistory.com

 

   4. ChatGPT