※ 요약
std::vector의 멤버 함수인 emplace_back은 C++11부터 추가된 멤버 함수로써 push_back과 같이 vector의 요소 끝에 원소를 추가하는 함수이다. 두 함수의 가장 큰 차이점은, push_back과 같은 삽입 함수들은 삽입할 객체를 받지만 emplace_back과 같은 생성 삽입 함수는 삽입할 객체의 생성자를 위한 인자들을 받아 std::vector 내에서 직접 객체를 생성하여 삽입하므로 임시 객체의 생성과 파괴, 복사(혹은 move)를 하지 않아도 되어 성능상 더 유리하다는 것이다.
필자가 전에 작성한 push_back도 꼭 읽어보길 바란다.

※ 함수 원형

template< class... Args >

void emplace_back( Args&&... args );


emplace의 함수 원형은 하나다. push_back과 다르게 가변인자 템플릿 문법을 이용하여 가변인자를 받는다.


※ 예제

설명을 위해 아래와 같이 임시로 예제를 작성해봤다.


먼저 push_back으로 삽입을 했을때 결과이다. push_back에 삽입하기 위해 객체를 만들어 전달했고 내부적으로 또 임시객체를 만들어 아래와 같이 호출이 많아 성능상 불리하다.


emplace_back으로 삽입할 경우, 생성에 필요한 인자를 받아 내부에서 생성 삽입하므로 아래와 같이 생성자, 소멸자를 한 번씩만 호출하여 성능상 유리하다

.




※ 실제 사용예
필자가 전에 push_back으로 작성했던 코드이다. 이 코드는 CStationObj 임시 객체를 생성하고 그것을 push_back에 전달하는 걸 알 수 있으며 성능을 따져봤을때 비효율적이다.(내부적으로 CStationObj의 임시 객체가 생성되고 생성자와 소멸자도 호출되기 때문)


emplace_back은 함수 원형에서 본 거와 같이 가변 인자를 받을 수 있어서 아래와 같이 인자를 넣을 수 있으며, 받은 인자를 std::vector안에서 직접 CStationObj를 생성하므로 push_back보다 성능상 낫다.


※ 참고 사항

- push_back으로 하여도 컴파일러 내부적으로 최적화 하기 때문에 emplace_back으로 하는 것과 별차이가 없을 수 있다. 고로 개인 프로젝트가 아니라면 호환성이 더 좋은 push_back 사용이 더 나을 수도 있다.

- push_back함수로 할 수 있는 모든 것을 emplace_back으로 할 수 있다.

- push_back함수보다 emplace_back 함수가 대체로 효율적이다.(무조건적인건 아님 반대로 push_back이 더 효율적일 때도 있음)



'STL - Containers > vector' 카테고리의 다른 글

[C++ STL] std::vector - push_back  (0) 2016.02.19
[C++ STL] std::vector 주요 멤버 함수 목록  (0) 2015.11.23
[C++ STL] std::vector 개요  (3) 2015.11.10

+ Recent posts