unreal 5기

250917 언리얼엔진 본캠프 32일차 push_back과 emplace_back

parkjinnam 2025. 9. 17. 21:23

push_back과 emplace_back

push_back은 그동안 벡터의 가장 뒤에 원소를 삽입한다라고 알고 있었다. 하지만 동일한 기능을 수행하는 emplace_back이 존재한다는 사실을 알게 되었다. 지난번 size와 capacity에서도 말했지만 동작이 완전히 동일하다면 이름을 나눌 필요가 없었을 것이다. 오늘은 이 두 가지 함수의 차이점에 대해서 알아보자.

 

push_back

위에서 말했듯 push_back은 단순하게 vector의 끝에다가 요소를 추가한다고 생각하기 쉽지만 실상은 다르다 여기서 중요한건 '어떻게' 요소를 추가하느냐인데 push_back은 엄밀히 말하면 객체를 집어넣는 것과 같으며 다음과 같은 과정을 거친다.

 

1. 벡터 밖에서 임시 객체를 생성하여 인자로 받은 값을 복사

 

2. 값을 복사 받은 임시 객체를 벡터의 끝으로 이동 후 삽입

 

3. 생성한 임시객체를 소멸시킴

 

여기서 중요한것은 push_back은 값을 복사하는 행동이 필연적으로 거치게 되어있다는 점이다. 임시 객체를 생성한다는 것은 어찌 됐던 객체를 생성하는 것이니 당연히 메모리 할당을 해줘야 할 것이고 생성자와 소멸자가 호출되기에 연산이 추가적으로 발생하게 된다. 또한 여기서 주의 깊게 봐야 하는 점은 임시 객체의 생성이 벡터함수 밖에서 발생한다는 점이다.

 

emplace_back

emplace_back은 push_back과 다르게 함수 내에서 객체를 생성해 삽입하는 형식을 갖는다.

 

1. emplace_back 함수에 인자를 넘김

 

2. emplace_back 내부에서 임시객체를 생성

 

3. vector에 객체 삽입

 

이런 단계를 거치기에 emplace_back은 생성자 호출 한번으로 끝나는 경우가 많다. 그렇기에 push_back에 비해서 emplace_back은 성능적인 면에서 이점이 있을 '수도' 있다. 왜 있을 수도 있냐 하면 컴파일러가 어떻게 최적화를 했느냐에 따라서 push_back과 emplace_back의 성능적인 면에서 비슷하거나 오히려 push_back이 더 빠를 수도 있기 때문이다.

 

그럼 무엇을 쓰는게 좋은가?

사실 딱 이것만 쓰라는 것이 정해진 것이 없다. 위에서도 설명했지만 성능적인 차이로 인해 무엇이 더 효율적이다는 컴파일러의 차이 등으로 인해 사실 비교하기 힘들고 결국은 push_back에서 필연적으로 발생하는 '이동'의 비용이 얼마나 비싸냐에 따라서 나뉘게 될 것 같다.