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_constructor와 move_assignment를 참고해요.