STL중 백터를 공부하다가 push_back과 emplace_back 두가지를 만났습니다.
둘의 차이가 궁금해져서 검색해보았습니다
먼저 제가 처음 이해했던 푸쉬백과 임플레이스백의 차이 입니다.
▲푸쉬백의 경우, 어딘가에 객체가 존재하던걸 넣거나 임시로 객체를 생성해서 벡터에 넣는 방식
▲ 임플레이스백의 경우, 받아온 정보를 바탕으로 바로 객체를 만들어 저장
즉 처음 제가 생각했던 푸쉬백과 임플레이스 백의 차이는
- push_back의 경우 객체를 넣기위해 복사가 일어나기에 절차와 메모리 낭비가 있음
- emplace_back의 경우 함수 내부서 객체 생성 후 삽입하기에 생성자 소멸자를 한번만 호출해서 효율적임
- push_back은 그냥 밀어넣기만 하고, emplace_back의 경우엔 새로 생성 후 방금 만든 객체에 대한 참조자 반환
일단 이렇게 요약을 했었는데요, 아래 두가지를 보고 생각이 바뀌었습니다.
▲ 첫째로, 친구 말을 듣고 푸쉬백을 비쥬얼 스튜디오로 까보니 최신 컴파일러에선
알아서 최적화가 어느정도 이루어지고 있는걸 발견하였습니다.
▲둘째로 스택오버플로우에서 본 댓글입니다.
최적화 면에선 엠플백이나 푸쉬백이나 큰 차이가 없고, 진짜 둘이 차이를 내는곳이 있다면 그곳은 바로
생성자를 호출하는 부분이라고 합니다. 상황에 맞는 기능을 쓰면 될 거 같습니다.
다른 댓글을 보면 타 라이브러리와의 호환성 언급과 동시에
emplace_back이 안먹히는 부분을 보여주는것도 보입니다.
결론은 그냥 원래 Push_back 쓰시던 분들은 그냥 계속 쓰시면 됩니다.
'정보들 > C,C++ 관련' 카테고리의 다른 글
inline 함수 vs 매크로 함수 (0) | 2020.06.23 |
---|---|
C++의 캐스팅 4가지 (0) | 2020.06.23 |
bool vs BOOL? (0) | 2020.06.23 |
C++ STL 종류들 및 사용처 (0) | 2020.06.23 |
assert를 디버깅에 활용 (0) | 2020.06.23 |