: 대입을 할 건데, 원본이 사용되지 않을 자원이면,
반드시 move 처리하자.
: swap 시 temp 변수로 인해 자원 생성, 소멸되는 것을 방지하는 코드를 만들어라.
객체 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에다가 이전하는 것이 효율적임.
move 사용
: move 키워드를 사용해 이동생성자, 이동대입 처리해서 자원 자체를
이동시키자.
결론
: 대입 후, 필요없는 버퍼에 대해서는 move 처리하는 것이 효율적이다.
: 벡터의 경우, 포인터 배열 대입과 동일하게 코딩해보자.
noexcept 사용하기
move를 사용하기 위해서는 move 생성자와 move 대입 뒤에 noexcept를 작성해야 함.
궁금한 점!!
다음 시간에 stl에서 버퍼 복사가 어떻게 진행되는지 알아보자.