✨using move : swap 개선과 배열 확장

보물창고·2022년 9월 14일
0

결론

: 대입을 할 건데, 원본이 사용되지 않을 자원이면,
반드시 move 처리하자.

problem

: swap 시 temp 변수로 인해 자원 생성, 소멸되는 것을 방지하는 코드를 만들어라.

swap을 개선하자.

  • 일반적인 swap을 템플릿 형태로 구현하라.
  • 객체 t1, t2를 swap 하라.

    잘 생각을 해보면, 복사가 3번이 발생함.
    -> 클래스에 멤버가 있따고 한다면 필요없는 자원할당이 3번 일어난다는 것이다.
    하지만 이전에 배운 move를 사용하면, 복사도 발생하지 않고,
    바로 소유권을 이전하므로 훨씬 효율적임.
    여기서 중요한 것은 멤버에 자원이 있다면 이다!

  • 클래스 Test를 만들고, 이동 생성자, 이동연산자를 만들자.

  • swap을 move를 통해 처리하라.

    -> move가 호출됨을 확인할 수 있음.
    : 출력으로 보면 별 차이를 못느끼겠지만, 이전 강의와 같이 동적 자원 멤버 존재시 , 메모리 절약됨.
    : 한 번 만들어보자!

  • stl의 swap을 사용해보아라
    -> stl의 swap도 move와 move 대입으로 이루어졌다는 것을 알 수 있음.

  • 그러면 move 대입과 move 생성자를 지우면 어떻게 될까?
    : 복사 생성자의 인자 모양이 const & 형태, 즉 rValue와 lValue모두 받을 수 있기 때문에, 이때는 복사 생성자와 복사 대입연산자가 호출됨.

  • move가 적용된 실제 swap 함수.

  • 만약에 클래스에 이동생성자와 이동연산자가 만들어지지 않은 상태에서
    stl 이나 위에 공식 swap에 넘기면 어떻게 될까???
    -> 알아서 복사가 이루어짐. (오버로딩 함수가 많다... )


배열 간의 대입 예시

  • 설정.
    : 이전에 2개만 사용하던 배열을 4개로 늘려서 사용하게 변경하자!
    그리고 옮긴 2개의 배열은 필요 없음.

  • 설명
    : 설정에서 옮겨진 작은 배열은 없어지는 것이므로, 대입이 아닌 move 대입으로 처리하는 것이 효율적임.

-> A, B를 C,D에다가 이전하는 것이 효율적임.

  • 대입
    : 생각할 부분이 이전에 사용했던 2개의 메모리는 이제 필요 없어지므로,
    자원 자체를 옮기자. (이전에 사용했던 a,b는 옮긴후 지울 것이다!)
    -> 현재는 새로운 메모리 2개 (복사 대입으로 인한) 생성으로 성능 저하발생함.
  • move 사용
    : move 키워드를 사용해 이동생성자, 이동대입 처리해서 자원 자체를
    이동시키자.

  • 결론
    : 대입 후, 필요없는 버퍼에 대해서는 move 처리하는 것이 효율적이다.

벡터 예시

: 벡터의 경우, 포인터 배열 대입과 동일하게 코딩해보자.

  • 벡터 객체를 생성할 때 2자리를 확보함.
    그리고 resize 함수를 이용해 메모리 공간은 4개로 확보하는 코드이고,
    어떻게 될까???
    -> copy가 나오네?

이동 함수가 호출되기 위해서는!

  • noexcept 사용하기
    move를 사용하기 위해서는 move 생성자와 move 대입 뒤에 noexcept를 작성해야 함.

  • 궁금한 점!!

      1. 이상한 점이 있음.
        : 왜 move= 대입이 출력되지 않고, move 생성자가 출력된 것일까??
      1. 왜 noexept를 붙여야 하지???
  • 다음 시간에 stl에서 버퍼 복사가 어떻게 진행되는지 알아보자.

profile
🔥🔥🔥

0개의 댓글