기본 패턴
cpp
std::string name = "RefDock";
std::string target = std::move(name);설명
- move semantics는 복사 대신 자원 소유권을 넘겨 비용을 줄이는 현대 C++ 핵심 개념입니다.
std::move는 실제로 옮기는 함수라기보다, 해당 객체를 이동 가능한 값으로 취급해 달라는 표시입니다.- 문자열, 벡터처럼 내부 버퍼를 가진 타입에서 이동의 효과가 크게 나타납니다.
- 이동 이후 원본 객체는 유효하지만, 값은 예측 가능한 상태라고 가정하지 않는 편이 좋습니다.
짧은 예제
cpp
#include <iostream>
#include <string>
#include <vector>
int main() {
std::vector<std::string> source{"A", "B", "C"};
std::vector<std::string> target = std::move(source);
std::cout << "target size = " << target.size() << "\n";
std::cout << "source size = " << source.size() << "\n";
}빠른 정리
| 항목 | 설명 |
|---|---|
| 복사 | 원본 내용을 새 객체에 그대로 복제 |
| 이동 | 자원 소유권을 새 객체로 넘김 |
std::move | 이동 가능 값으로 취급하도록 캐스팅 |
| 큰 객체 | 이동의 효율 이점이 큼 |
| 이동 후 객체 | 파괴 가능하고 재할당 가능한 상태는 유지 |
주의할 점
std::move를 썼다고 해서 항상 성능이 좋아지는 것은 아닙니다. 이동 후 원본을 곧바로 다시 쓰는 코드는 오히려 읽기 어렵고 오류를 만들기 쉽습니다.