move_operator — 이동 연산

move_operator — 이동 연산 (Move)

**이동 연산(move)**은 복사 대신 자원을 "훔쳐오는" 연산으로, C++11에서 도입된 핵심 개념이에요. 이동 생성자와 이동 대입 연산자로 구성돼요.

이동의 자세한 내용은 이동 생성자(move constructor)와 이동 대입 연산자(move assignment) 문서를 참고해요.

출처: cppreference (이동 대입으로 리다이렉트)

본문

std::move는 객체를 rvalue로 캐스팅해서, 복사 대신 이동이 선택되도록 하는 유틸리티예요.

#include <utility>
std::string a = "hello";
std::string b = std::move(a);  // a의 내부 버퍼가 b로 이동 (복사보다 효율적)
// 이제 a는 비어 있을 수 있음 (유효하지만 미지정 상태)

이동 연산의 핵심 특징:

  • 이동 생성자(move constructor)T(T&&) 형태. rvalue로 새 객체를 만들 때 원본의 자원을 이동.
  • 이동 대입 연산자(move assignment)T& operator=(T&&) 형태. rvalue로부터 자원을 이동해 대입.
class Buffer {
    int* data_;
    std::size_t size_;
public:
    // 이동 생성자
    Buffer(Buffer&& other) noexcept
        : data_(other.data_), size_(other.size_) {
        other.data_ = nullptr;  // 원본을 유효한 빈 상태로
        other.size_ = 0;
    }
    // 이동 대입 연산자
    Buffer& operator=(Buffer&& other) noexcept {
        if (this != &other) {
            delete[] data_;
            data_ = other.data_;
            size_ = other.size_;
            other.data_ = nullptr;
            other.size_ = 0;
        }
        return *this;
    }
};

이동은 복사가 비싼 자원(특히 힙 메모리, 파일 핸들)을 값 의미론으로 전달할 때 성능을 크게 높여줘요. std::vector, std::string 같은 표준 컨테이너가 이동을 활용해요. 이동 후 원본 객체는 "유효하지만 미지정(valid but unspecified)" 상태가 되는 것이 일반적이에요.

자세한 내용은 move_constructormove_assignment를 참고해요.

더 알아보기 (Learn more)

cppreference