1 minute read

  • 이동 의미론이란 객체의 자원 소유권을 복사를 통해 복제하는 것이 아니라 이전 하는 방식을 성능과 메모리 효율을 극대화 하는 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