STL에서 여러 컨테이너를 사용할때 push종류와 emplace 종류가 있다.

대표적인 STL 컨테이너인 Vector를 예를 들었을때 push_back과 emplace_back인데 이 둘은 결국

선언된 vector에 item을 넣는다는 것은 같다 하지만 중요한 차이가 있다.

중간에 임시 객체를 생성하여 이동생성자가 불려지는 것이다.

int main(){
	vector<Item> m_vecItem;

	std::cout << "excute push_back()" << "\\n";
    m_vecItem.push_back(Item(1));
}

위와 같은 push_back을 사용한 코드가 있을 때

  1. Item(1)을 통해 임시 객체를 생성함.
  2. 임시 객체를 이동생성자를 통해 함수 내에 임시 객체를 만듦
  3. 벡터에 객체를 삽입함.
excute push_back()
일반 생성자 호출 
이동 생성자 호출
소멸자 호출
소멸자 호출

그러면 위 같은 결과가 나온다.

emplace_back의 경우에는

int main(){
	vector<Item> m_vecItem;

	std::cout << "excute emplace_back()" << "\\n";
    m_vecItem.emplace_back(1);
}

위와 같은 emplace_back을 사용한 코드가 있을 때

  1. emplace_back 함수에서 Item 객체를 만들기 위해서 필요한 매개변수를 넘김
  2. 함수 내부에서 임시 객체가 생성됨
  3. 벡터에 임시 객체를 삽입