STL중 백터를 공부하다가 push_back과 emplace_back 두가지를 만났습니다. 
둘의 차이가 궁금해져서 검색해보았습니다


먼저 제가 처음 이해했던 푸쉬백과 임플레이스백의 차이 입니다.

▲푸쉬백의 경우, 어딘가에 객체가 존재하던걸 넣거나 임시로 객체를 생성해서 벡터에 넣는 방식

 

▲ 임플레이스백의 경우, 받아온 정보를 바탕으로 바로 객체를 만들어 저장

 

즉 처음 제가 생각했던 푸쉬백과 임플레이스 백의 차이는

 

- push_back의 경우 객체를 넣기위해 복사가 일어나기에 절차와 메모리 낭비가 있음
- emplace_back의 경우 함수 내부서 객체 생성 후 삽입하기에 생성자 소멸자를 한번만 호출해서 효율적임
- push_back은 그냥 밀어넣기만 하고, emplace_back의 경우엔 새로 생성 후 방금 만든 객체에 대한 참조자 반환

 

일단 이렇게 요약을 했었는데요, 아래 두가지를 보고 생각이 바뀌었습니다.

 

 첫째로, 친구 말을 듣고 푸쉬백을 비쥬얼 스튜디오로 까보니 최신 컴파일러에선
알아서 최적화가 어느정도 이루어지고 있는걸 발견하였습니다.

 

https://stackoverflow.com/questions/10890653/why-would-i-ever-use-push-back-instead-of-emplace-back/10890716#10890716

 

Why would I ever use push_back instead of emplace_back?

C++11 vectors have the new function emplace_back. Unlike push_back, which relies on compiler optimizations to avoid copies, emplace_back uses perfect forwarding to send the arguments directly to the

stackoverflow.com

▲둘째로 스택오버플로우에서 본 댓글입니다.

 

최적화 면에선 엠플백이나 푸쉬백이나 큰 차이가 없고, 진짜 둘이 차이를 내는곳이 있다면 그곳은 바로 
생성자를 호출하는 부분이라고 합니다. 상황에 맞는 기능을 쓰면 될 거 같습니다.

 

다른 댓글을 보면 타 라이브러리와의 호환성 언급과 동시에
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

+ Recent posts