본문 바로가기
프로그래밍/C++

C++ push_back()과 emplace_back() 차이

by bantomak 2025. 10. 7.
반응형

push_back() 이미 만들어진 객체를 복사 또는 이동해서 추가

  • push_back은 이미 생성된 객체를 추가할 때 사용한다.
  • 내부적으로 복사 생성자 혹은 이동 생성자가 호출된다.
std::vector<std::string> v;
std::string s = "Hello";
v.push_back(s);        // 복사 발생
v.push_back(std::move(s)); // 이동 발생 (C++11 이상)
v.push_back("World");  // 임시 객체 생성 후 이동

emplace_back() 그 자리에서 바로 생성(in-place construction)

  • 전달된 인자를 사용해 생성자에서 바로 객체 생성, 새로 만드는 객체를 추가할 때 사용한다.
  • 별도의 임시 객체를 만들지 않아서 불필요한 복사나 이동이 없음
  • 성능적으로 더 효율적이다.
std::vector<std::string> v;
v.emplace_back("Hello");         // 직접 생성 (복사/이동 없음)
v.emplace_back(5, 'a');          // "aaaaa" 생성

std::vector<std::pair<int, int>>로 알아보는 실제 예시

  • push_back() 사용시 std::make_pair() 메서드를 반드시 사용해야 함
  • push_back()은 이미 생성된 객체를 추가하는 메서드이기 때문
  • 하지만 emplace_back() 사용 시에는 std::make_pair()를 사용하지 않아도 추가 가능
std::vector<std::pair<int, int>> myVec;

myVec.push_back(std::make_pair(1, 2)); // push_back 사용시 std::make_pair 사용해야함
myVec.push_back(std::make_pair(3, 4));
myVec.push_back(std::make_pair(5, 6));

std::vector<std::pair<int, int>> myVec2;
myVec2.emplace_back(1, 2);
myVec2.emplace_back(3, 4);
myVec2.emplace_back(5, 6);

push_back() 의 내부 동작  

--- push_back with make_pair ---
Constructed (1, 2)
Moved (1, 2)

 

make_pair를 통해서 임시 객체를 만들고 이동 생성자를 통해서 vector 내부에 추가된다.

emplace_back() 의 내부 동작  

--- emplace_back ---
Constructed (3, 4)

 

별도의 임시 생성자 없이 생성자를 통해서 vector 내부에 추가된다.

정리하자면

push_back()과 emplace_back()이 어떻게 다른지 그리고 어떤 상황에서 쓰면 좋을지에 대해서 알아봤다.

  • 완성된 객체나 변환 가능한 값을 추가한다면 push_back()
  • 새로 값을 추가하고 싶다면 emplace_back()
  • push_back()은 임시 객체와 이동/복사 생성자가 호출된다.
  • emplace_back()은 생성자만 호출된다.

댓글