push_back()과 emplace_back() 둘 다 벡터의 뒤쪽에 원소를 추가합니다. 그런데 실제로 구현된 복사/이동 방식은 크게 다르며, 성능에서도 차이가 납니다.
push_back()
vs.push_back(s)는 문자열을 벡터로 복사합니다. 먼저, char *로 초기화된 새 문자열 객체가 암시적으로 생성됩니다. 그 다음 push_back()이 호출되는데, push_back()은 이동 생성자를 이용해 임시 문자열을 벡터로 복사합니다. 작업이 다 끝나면 임시 객체를 없앱니다.
emplace_back()
vs.emplace_back(s)는 임시 문자열을 생성하지 않습니다. emplace_back()이 char *를 인수로 하여 직접 호출합니다. 그런 다음 이 char *로 초기화된 벡터에 저장할 문자열을 생성합니다. 따라서 불필요한 임시 문자열 객체를 생성하고 파괴할 필요가 없습니다.
#include <vector>
#include <string>
#include <iostream>
int main() {
std::vector<std::string> vec1, vec2;
std::string s = "hello";
// push_back의 경우
vec1.push_back(s); // 복사 발생
vec1.push_back(std::move(s)); // 이동 발생
vec1.push_back("world"); // 임시 객체 생성 후 이동
// emplace_back의 경우
vec2.emplace_back("hello"); // 직접 생성, 불필요한 이동 없음
vec2.emplace_back("world");
return 0;
}
출처 : 266가지 문제로 정복하는 코딩 인터뷰 in C++
'내일배움캠프 > TIL' 카테고리의 다른 글
[내일배움캠프 Day37] TWeakObjectPtr (0) | 2025.02.11 |
---|---|
[내일배움캠프 Day35] 알고리즘 수업 1주차 과제 (1) | 2025.02.07 |
[내일배움캠프 Day32] 가상 함수 동작 원리 (0) | 2025.02.04 |
[내일배움캠프 Day31] 순차 컨테이너 (1) | 2025.02.03 |
[내일배움캠프 Day30] auto (0) | 2025.01.31 |