move 함수

move semantic

// 아래 함수는 a와 b의 값을 swap하는데 무려 3번의 복사를 수행한다
template <typename T>
void my_swap(T &a, T &b) {
  T tmp(a);
  a = b;
  b = tmp;
}

// 불필요한 메모리 사용을 줄이고 단순히 값을 이동시키는 방법
// 추가적인 메모리 사용 없이 3번의 이동으로 swap이 실행된다
template <typename T>
void my_swap(T &a, T &b) {
  T tmp(std::move(a));
  a = std::move(b);
  b = std::move(tmp);
}
  • move 함수는 좌측값을 우측값으로 타입 변환을 시켜줄 뿐 실제로 이동시켜주지 않는다
    • 실제 이동은 이동 생성자나 이동 대입 연산자를 호출할 때 수행
class A {
 public:
  A() { std::cout << "ctor\n"; }
  A(const A& a) { std::cout << "copy ctor\n"; }
  A(A&& a) { std::cout << "move ctor\n"; }
};

class B {
 public:
  A a_;
};

// 객체 b 안에 a를 b.a_로 이동시키고 싶다면
// class B에 무엇을 추가해야 할까?
int main() {
  A a;

  std::cout << "create B-- \n";
  B b(/* ?? */);
}

// 정답: 
class B {
 public:
 // 인자 a를 우측값 레퍼런스로 받도록 함
 // 받은 a 자체는 좌측값이므로 우측값으로 캐스팅
  B(A&& a) : a_(std::move(a)) {}

  A a_;
};

int main() {
  A a;
  std::cout << "create B-- \n";
  B b(std::move(a));
}

출처

Categories: ,

Updated: