placement new

Naezan·2024년 4월 20일

C++

목록 보기
4/5
post-thumbnail

placement new operator

placement newnew operator의 변형 연산자입니다.
일반적으로 new 연산자는 메모리를 할당하고 할당된 메모리에 객체를 생성하게 됩니다.
placement new를 사용하면 위의 두 가지를 분리할 수 있습니다. placement new에서는 미리 할당된 메모리를 전달하고 전달된 메모리에 객체를 생성할 수 있습니다.

메모리 할당은 이미 되어 있는 상태에서 메모리의 공간만 이용하여 새로운 객체를 생성한다는 의미입니다.

placement new 예제코드1

int main() 
{ 
 	// int 크기의 2배만큼 스택 메모리공간 할당
	char* buf = new char[sizeof(int) * 2]; // 8바이트
	cout << "버퍼의 시작주소 : " << (int*)(buf) << endl;

	// buf의 0번째 주소공간에 2의 값을 가지는 int 생성
	int* pInt1 = new (buf) int(2);
	cout << "pInt1의 시작주소 : " << pInt1 << endl;

	// buf의 (0 + 4)의 주소 공간에 7의 값을 가지는 int 생성
	int* pInt2 = new (buf + sizeof(int)) int(7);
	cout << "버퍼의 시작주소 + 4 : " << (int*)(buf + sizeof(int)) << endl;
	cout << "pInt2의 시작주소 : " << pInt2 << endl;
  
    return 0; 
} 

위 코드를 실행하면 아래와 같이 출력됩니다.

실제로 할당된 메모리에 들어가 있는 값은 아래와 같이 나타낼 수 있으며 이미 할당된 메모리 공간을 사용하고 있는 것을 알 수 있습니다.

placement new 예제코드2

int main() 
{ 
 	int val = 5;

	cout << "val : " << val << "\t" << "주소 : " << &val << endl;

	// val의 공간에 5048의 값 저장
	int* pNew = new (&val) int(5048);

	cout << "val : " << val << "\t" << "주소 : " << &val << endl;
	cout << "pNew : " << *pNew << "\t" << "주소 : " << pNew << endl;
  
    return 0; 
} 

위 코드를 실행하면 아래와 같이 출력됩니다.

실제로 할당된 메모리에 들어가 있는 값은 아래와 같이 나타낼 수 있고 주소를 공유하기 때문에 val의 값 역시 변경된 걸 알 수 있습니다.

new와 placement new

newplacement new는 메모리의 할당과 생성이 일치하지 않기 때문에 두 operator가 동일하지 않습니다.

  • new힙에 메모리를 할당하고 그곳에 객체를 생성하는 반면, placement new이미 할당된 주소에 객체를 생성합니다.
  • new는 메모리 위치를 명확하게 알 수 없지만, placement new는 메모리 위치를 알 수 있습니다.
  • new로 할당을 할 때는 delete를 사용하여 할당을 해제할 수 있지만 placement newdelete를 할 수 없습니다. 대신 소멸자를 사용하여 객체를 명시적으로 파괴할 수 있습니다.

placement를 언제 사용해야할까?

메모리의 할당을 지속적으로 수행하는데에는 많은 비용이 듭니다. 이러한 단점을 placement new를 이용하면 일부 개선할 수 있습니다.

미리 할당된 메모리를 사용하기 때문에 메모리 풀(memory pool) 을 구현할 때 유용하게 쓰일 수 있으며 메모리 할당이 실패하면 치명적인 에러를 유발하는 코드(예를 들면 사람의 생명을 다루는 기기) 에 사용될 수 있습니다.

참고자료

https://www.geeksforgeeks.org/placement-new-operator-cpp/
https://stackoverflow.com/questions/222557/what-uses-are-there-for-placement-new

profile
게임 개발자

0개의 댓글