push_back vs emplace_back()

이화랑·2025년 10월 29일

C++에서 push_back()과 emplace_back()은 둘 다 std::vector, std::list 등에 원소를 뒤에 추가할 때 사용하는 함수이지만 객체를 추가하는 방식에 차이가 있습니다.

🔹 1. push_back()

✅ 개념

  • 이미 만들어진 객체를 복사(copy) 또는 이동(move) 해서 컨테이너에 추가함.

📌설명

  • push_back()은 인자로 이미 생성된 객체를 받음
  • 내부적으로 복사 생성자(copy constructor)나 이동 생성자(move constructor)를 호출함
  • 즉, 객체가 한 번 더 만들어지는 비용이 있음

🔹emplace_back()

✅ 개념

  • 컨테이너의 마지막 위치에서 직접 객체를 생성(in-place construction) 함.

📌 설명

  • emplace_back()은 전달된 인자를 이용해 그 자리에서 객체를 생성함
  • 복사/이동 생성이 필요 없음 (불필요한 생성자 호출 X)
  • 인자를 그대로 생성자에 전달하므로 가장 효율적

🔹비교 요약

구분push_back()emplace_back()
인자이미 만들어진 객체생성자 인자 그대로 전달
동작복사 또는 이동 후 추가컨테이너 내부에서 직접 생성
생성자 호출 수1회 이상 (복사/이동 생성자)1회 (생성자만)
성능조금 비효율적더 효율적
사용 예v.push_back(obj);v.emplace_back(args...);

그럼 emplace_back 만 사용하면 되지않아?

  • 결론부터 말하면 무조건 emplace_back()이 더 좋다고만 볼 수는 없다.
  • 상황에 따라 push_back()이 더 적절할 때도 있다.

1️⃣ emplace_back이 유리한 경우

  1. 객체를 새로 생성해야 할 때
  2. 복사/이동 비용이 큰 클래스를 다룰 때
  3. 생성자 인자를 그대로 전달하고 싶을 때
std::vector<std::string> v;
v.emplace_back("Hello"); // 문자열이 바로 벡터 안에서 생성됨

2️⃣ push_back이 적절한 경우

  • 이미 존재하는 객체를 벡터에 넣어야 할 때
std::string s = "Hello";
v.push_back(s); // s는 이미 만들어진 객체

// emplace_back으로도 가능하지만, 오히려 불필요하게 생성자를 호출할 수 있음
  • 이미 만들어진 객체를 넣는 경우엔 차이가 거의 없음

✅ 결론

  • 단순 값 타입(int, double)에는 차이 거의 없음
  • 사용자 정의 클래스(객체) 추가 시엔 emplace_back()이 더 효율적
profile
백엔드 개발자에서 언리얼 엔진 개발자 직변중

0개의 댓글