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));
}
출처