C++ 이동 의미론

std::move rvalue 표시

이동 의미론은 비싼 복사를 피하지만, moved-from 객체가 여전히 파괴 가능하고 대입 가능한 상태여야 한다. lvalue/rvalue, 이동 생성자, noexcept, self-move를 함께 확인한다.

01

비용 확인

복사 비용이 큰 자원 소유 객체인지 먼저 확인한다.

필요한 곳에만
02

이동 후보화

std::move는 객체를 rvalue로 캐스팅할 뿐 실제 이동은 생성자/대입자가 수행한다.

자원 이전
03

자원 이전

대상은 포인터나 핸들을 가져가고 원본은 안전한 빈 상태로 남긴다.

double free 방지
04

컨테이너 재배치

move constructor가 noexcept이면 vector가 재할당 시 이동을 선택하기 쉽다.

성능 영향
move ctor
새 객체로 자원 이전 원본 자원을 훔치고 원본을 파괴 가능한 상태로 만든다.
steal and null
move assign
기존 자원 정리 후 이전 자기 이동과 예외 안전성을 함께 고려한다.
self-move 경계
copy elision
이동보다 더 좋은 생략 return local에서 불필요한 std::move는 복사 생략을 방해할 수 있다.
NRVO
forward
값 범주 보존 템플릿 전달 함수에서는 std::move가 아니라 std::forward<T>가 필요하다.
perfect forwarding

사용 후 이동 · noexcept · 반환 점검

사용 후 이동 moved-from 객체에서 값 의미를 가정하지 않고 재대입 또는 파괴만 하는지 본다.
noexcept 이동 생성자에 noexcept를 붙일 수 있는지 검토한다.
반환 지역 변수를 return할 때 무의미한 std::move가 있는지 확인한다.