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이 유리한 경우
- 객체를 새로 생성해야 할 때
- 복사/이동 비용이 큰 클래스를 다룰 때
- 생성자 인자를 그대로 전달하고 싶을 때
std::vector<std::string> v;
v.emplace_back("Hello");
2️⃣ push_back이 적절한 경우
std::string s = "Hello";
v.push_back(s);
- 이미 만들어진 객체를 넣는 경우엔 차이가 거의 없음
✅ 결론
- 단순 값 타입(int, double)에는 차이 거의 없음
- 사용자 정의 클래스(객체) 추가 시엔 emplace_back()이 더 효율적