- 이동 의미론이란 객체의 자원 소유권을 복사를 통해 복제하는 것이 아니라 이전 하는 방식을 성능과 메모리 효율을 극대화 하는 C++11의 중요한 기능임
- 복사 의미론과 반대로 기존 객체의 내용을 복제하지 않고 기존 객체의 소유권을 새 객체로 이동시켜 불필요한 데이터 복사를 피함
- 이동 후 원본 객체는 자원을 더 이상 소유하지 않으며,
valid-but-unspecified 상태가 됨
- 이동 생성자와 이동 할당 연산자가 도입되어 자원의 소유권을 효율적으로 이전할 수 있음
이동 생성자 예시
class MyClass
{
public:
MyClass(MyClass&& other) noexcept; // 이동 생성자
MyClass& operator=(MyClass&& other) noexcept; // 이동 대입 연산자
};
rvalue 를 매개변수로 받아 소유권을 이전시킴
std::move
<utility> 헤더에 정의되어있으며 컴파일러가 리소스를 이동할 수 있도록 허용함
- 객체를
rvalue로 캐스팅하여 lvalue라 하더라도 강제로 이동할 수 있도록 함
- 실제 이동은 move 생성자/연산자가 실행될 때 일어남
- 표준 컨테이너
std::vector, std::string, std::unique_ptr 등은 이동 의미론을 완벽하게 지원함
#include <utility>
...
std::vector<int> vec(1000000, 1);
std::vector<int> newVec;
newVec = vec; // copy semantics
newVec = std::move(vec); // move semantics
std::move 는 메모리의 추가적인 할당이나 해제가 필요하지 않아 복사보다 비용이 저렴함
- 복사할 수 없는 객체에 대해서 이동을 적용할 수 있음
주의
- 이동생성자나 이동 대입 연산자의 정의가 없을 경우
std::move는 이동이 아닌 복사가 이루어짐
결론
- 이동 의미론은 메모리 관리의 효율을 위한 하나의 수단이며 이동 생성자, 이동 대입 연산자를 통해 수행할 수 있다
std::move 함수는 lvalue를 rvalue로 캐스팅하여 이동을 강제할 수 있게 한다
Comments