1. "무엇입니까?"
std::move()
기술적으로는 함수 이지만 실제로 는 함수 가 아니라고 말할 수 있습니다 . 컴파일러가 표현식의 값을 고려하는 방식 사이 의 변환기 입니다.
2. "무엇을합니까?"
가장 먼저 주목할 것은 std::move()
실제로 아무것도 움직이지 않는다는 것 입니다. 표현식을 이름이 지정된 변수와 같은 lvalue 에서 xvalue로 변환 합니다. xvalue는 컴파일러에게 다음을 알려줍니다.
당신은 저를 약탈하고, 내가 가지고있는 것을 옮기고 다른 곳에서 사용할 수 있습니다 (어쨌든 곧 파괴 될 것이기 때문에) ".
즉,를 사용할 때 std::move(x)
컴파일러가 식인종을 허용합니다 x
. 따라서 x
메모리에 자체 버퍼가 있다면 std::move()
컴파일러가 다른 객체를 소유 할 수 있습니다.
prvalue (예 : 임시로 전달되는) 에서 이동할 수도 있지만 거의 유용하지 않습니다.
3. "언제 사용해야합니까?"
이 질문을하는 또 다른 방법은 "기존 객체의 자원을 어떻게 잠식 할 수 있습니까?"입니다. 글쎄, 응용 프로그램 코드를 작성한다면 컴파일러가 만든 임시 객체를 많이 사용하지 않을 것입니다. 따라서 주로 생성자, 연산자 메서드, 표준 라이브러리 알고리즘과 같은 함수 등에서 객체를 자동으로 많이 생성하고 파괴하는 장소 에서이 작업을 수행합니다. 물론, 그것은 단지 경험의 법칙입니다.
일반적으로 복사 대신 한 개체에서 다른 개체로 리소스를 '이동'합니다. @Guillaume 은이 페이지에 링크되어 있으며 간단한 예제가 있습니다. 두 개의 객체를 적은 복사로 바꾸는 것입니다.
template <class T>
swap(T& a, T& b) {
T tmp(a); // we now have two copies of a
a = b; // we now have two copies of b (+ discarded a copy of a)
b = tmp; // we now have two copies of tmp (+ discarded a copy of b)
}
이동을 사용하면 자원을 복사하지 않고 교환 할 수 있습니다.
template <class T>
swap(T& a, T& b) {
T tmp(std::move(a));
a = std::move(b);
b = std::move(tmp);
}
T
예 vector<int>
를 들어 크기가 n 일 때 어떤 일이 발생하는지 생각해보십시오 . 첫 번째 버전에서는 3 * n 요소를 읽고 씁니다. 두 번째 버전에서는 기본적으로 벡터 버퍼에 대한 3 개의 포인터와 3 개의 버퍼 크기 만 읽고 씁니다. 물론, 수업 T
은 어떻게 움직이는지를 알아야합니다. 이 클래스가 T
작동하려면 클래스 에 이동 할당 연산자와 클래스 를 위한 이동 생성자가 있어야합니다.