Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ 배치 new(Placement New) 연산자의 이해와 활용 방법

이 글에서는 C++의 배치 new(placement new) 연산자가 무엇인지, 그리고 일반적인 new 연산자와 어떻게 다른지 자세히 알아보겠습니다.

배치 new란 무엇인가?

배치 new는 new 연산자의 또 다른 변형 형태입니다. 먼저 일반적인 new 연산자의 동작을 살펴보면, 다음 두 가지 작업을 수행합니다.

  • 메모리를 할당합니다.
  • 할당된 메모리에 객체를 생성(construct)합니다.

일반 new 연산자는 힙(heap) 영역에 메모리를 할당하고 그곳에 객체를 생성합니다. 반면 배치 new 연산자는 이미 존재하는 특정 주소에 객체를 생성한다는 점이 큰 차이입니다.

메모리 해제의 문제점

일반 new 연산자로 할당한 메모리는 delete 키워드를 사용해 해제할 수 있습니다. 하지만 배치 new에는 이에 대응하는 '배치 delete(placement delete)' 기능이 존재하지 않습니다. 따라서 배치 new로 생성한 객체는 소멸자를 명시적으로 호출하는 등 별도의 관리가 필요하며, 메모리 자체의 해제는 해당 메모리를 원래 할당한 방식(delete 또는 free 등)에 따라 처리해야 합니다.

배치 new의 장점

요약하면, 배치 new는 이미 할당된 메모리 위에 객체를 '생성'할 수 있게 해주는 기능입니다. 새로 메모리를 할당하지 않고 기존에 확보된 메모리를 재사용하기 때문에 불필요한 할당·해제 오버헤드가 사라져 성능 최적화에 유용합니다. 이러한 특성 덕분에 게임 엔진, 임베디드 시스템, 메모리 풀(memory pool) 구현 등에서 널리 활용됩니다.

사용 문법

배치 new는 다음과 같은 형식으로 사용합니다.

new (address) (type) initializer

괄호 안에 객체를 생성하고 싶은 주소(address)를 지정하면, 해당 타입(type)의 객체가 그 주소에 초기값(initializer)과 함께 생성됩니다. 아래 예제를 통해 실제 동작을 확인해 보겠습니다.

예제 코드

#include<iostream>
using namespace std;
int main() {
   int a = 5;
   cout << "a = " << a << endl;
   cout << "&a = " << &a << endl;
   // 배치 new를 사용해 변수 a의 값을 10으로 변경
   int *m = new (&a) int(10);
   cout << "\nAfter using placement new:" << endl;
   cout << "a = " << a << endl;
   cout << "m = " << m << endl;
   cout << "&a = " << &a << endl;
   return 0;
}

실행 결과

a = 5
&a = 0x22fe34
After using placement new:
a = 10
m = 0x22fe34
&a = 0x22fe34

결과 분석

실행 결과를 보면 흥미로운 점을 발견할 수 있습니다. 변수 a의 주소(&a)는 0x22fe34였고, 배치 new를 통해 이 주소에 정수 10을 생성했습니다. 그 결과 포인터 m이 가리키는 주소 역시 0x22fe34로 동일하며, 변수 a의 값이 5에서 10으로 변경되었습니다.

즉, 배치 new는 새로운 메모리를 할당한 것이 아니라 기존 변수 a의 메모리 공간을 그대로 재사용하여 새로운 값으로 초기화한 것입니다. 이처럼 배치 new를 활용하면 메모리 재할당 없이 객체를 효율적으로 생성할 수 있습니다.