push_back vs emplace_back

보물창고·2023년 12월 26일
0

stl 잘 사용하기!

목록 보기
8/9
post-custom-banner

참고 자료

차이점은

  • push_back은 2개의 오버로딩 함수를 가지고 있음.
    - rvalue 와 lvalue
  • emplace_back은 보편 참조로 되어 있고, 내부적으로 forward 처리하고 있음.

예시 코드

  • push_back의 한계
    : lvalue 도 아니고, rvalue도 아님.
    rvalue라고 생각했지만, 암시적 형변환을 통해서 임시객체를 만들지 않는 것을 확인할 수 있음.

  • 임시객체를 넣자.
    : 우리가 move 생성자를 호출하는 것은 내부 자원을 다른 객체에다가 완전히 이동하는 것임.
    오키, 복사 생성자에서 자원을 복사하는 것보다는 좋지만,
    궁극적으로 고찰한것은 그냥 함수 내의 인자를 move 하지 않고, 그냥
    생성자에다가 넘겨주면 훨씬 효율 적일텐데를 생각하게 됨.

  • 그래서 나온것이 emplace 계열 함수이고,
    emplace_back 함수를 사용하자.
    : 생성자와 소멸자가 단 한번만! 호출함.

  • 주의할 점으로는 이렇게 사용하면 안됨.
    : 괄호를 통해서 친절하게 인자로 보낼거야! 하고 작성했는데, 오류 발생..
    - 여러가지 오류가 발생하는데, vector 내부적 설계 구조에 의해 발생함.

  • push_back 과 마찬가지로 임시객체를 넣게 되면, 이동 생성자 호출함.

주의할 점

: 반드시 emplace 계열의 함수가 push 함수보다 성능이 좋은 것은 아님.
예외가 있음.

  • 잘 알고 사용해야 해..

사용해보자.

: directX에서 사용함.

  • 생성자부분
  • 호출부분.
    : 복사가 발생하겠지.
  • 이런식으로 사용했는데, 안됨..
    : 당연히 안되지, 7개의 인자를 가지고 있는 암시적 형변환 생성자가 없기 때문에.

  • 그래서 이렇게 해봄. 생성자 구조에 맞게, 생성자 3개 사용

나의 결론

  • 인자를 7개 가지는 생성자를 구현할 것인가??...
    나의 결론 , 위와 같이 여러 객체들의 초기화 필요할 경우, push_back을 통해 move 하고,
    생성자의 초기화가 간단하게 처리되어 있다면 emplace_back으로 한번에 넣자.

결론

emplace_back 사용할 때, 임시객체를 인자로 넣는것이 아니라,
인자 를 direct로 넣자

profile
🔥🔥🔥
post-custom-banner

0개의 댓글