Move Model

move 의미론 신호

std::move는 이동을 실행하지 않는다. 객체를 rvalue로 취급해 이동 생성자나 이동 대입이 선택될 수 있게 만드는 캐스트다.

01

마지막 사용 지점 탐색

std::move는 이후 값을 읽지 않아도 되는 위치에서만 명확하게 쓴다.

02

noexcept 이동을 검토한다

vector는 재할당 시 move가 noexcept가 아니면 복사를 선택할 수 있다.

03

const 이동 의심

const 객체에 std::move를 걸면 이동 생성자가 아니라 복사가 선택될 가능성이 크다.

move ctor
새 객체로 소유권 이전 원본 리소스를 새 객체가 가져가고 원본은 비운다.
파괴 가능한 상태가 필수다.
move assign
기존 객체 갱신 기존 리소스를 정리하고 원본 리소스를 가져온다.
자기 대입과 예외 안전성을 본다.
forward
값 범주 보존 템플릿 인자를 받은 범주대로 다음 함수에 전달한다.
std::forward<T>와 짝이다.
RVO
반환 최적화 지역 객체 반환에 불필요한 std::move를 넣으면 최적화를 방해할 수 있다.
컴파일러 경고를 확인한다.

이후 사용 · noexcept · 불필요 move 점검

이후 사용 move한 변수의 구체 값에 다시 의존하지 않는가.
noexcept 리소스 소유 타입의 move 연산이 noexcept 가능한가.
불필요 move 반환문에서 RVO가 가능한 값을 강제로 move하지 않는가.

마지막 사용

std::string name = make_name();
users.push_back(User{std::move(name)
        overflow-wrap: break-word;
        word-break: keep-all;
      });
// name은 이후 새 값을 대입하거나 파괴만 기대한다.