Programing

C ++ 11에 &&가있을 때 std :: move를 사용하는 이유는 무엇입니까?

lottogame 2020. 12. 8. 07:36
반응형

C ++ 11에 &&가있을 때 std :: move를 사용하는 이유는 무엇입니까?


중복 가능성 :
이동 의미론이란 무엇입니까?

저는 최근에 C ++ 11 세미나에 참석했고 다음과 같은 조언을 받았습니다.

when you have && and you are unsure, you will almost always use std::move

std::move어떤 대안을 사용하지 않고 사용해야하는 이유 와 사용해서는 안되는 경우를 설명해 주 std::move시겠습니까?


먼저, 제가 다룰 질문에 오해가있을 것 입니다. 코드에서
볼 때마다 T&& t(그리고 T는 템플릿 유형이 아닌 실제 유형입니다)의 값 범주 t는 rvalue가 아니라 lvalue (참조)라는 점 을 명심하십시오. (임시) 더 이상. 매우 혼란 스럽습니다. T&&단지 수단 t되어 구성 r- 수치였다 물체로부터 1 하지만 t 자체 좌변 아닌 r- 수치이다. 이름 (이 경우 t) 있으면 lvalue이고 자동으로 이동하지 않지만 이름이 없으면 (의 결과 3+4) rvalue이고 가능한 경우 자동으로 결과로 이동합니다. 유형 이 경우 (T&&)는 변수의 값 범주 (이 경우 lvalue)와 거의 관련이 없습니다.

당신이 경우 그 존재는 말했다 T&& t코드 작성 방법 당신이 변수에 대한 참조를 가지고 있었다 임시을, 그리고 당신이 원한다면 파괴 괜찮습니다. 당신이 변수를 여러 번 액세스해야하는 경우, 당신은 할 수 없습니다 원하는 std::move그것에서, 그렇지 않으면 그것의 가치를 잃는 것이다. 그러나 마지막으로 액세스 t때 원하는 경우 std::move다른 사람에게 가치 가있는 것이 안전합니다 T. (그리고 95 %는 당신이 원하는 것입니다.) 이 모든 것은 auto&&변수 에도 적용됩니다 .

1. T템플릿 유형 T&&인 경우 대신 전달 참조이며이 경우 마지막 시간 std::forward<T>(t)대신 사용 합니다 std::move(t). 이 질문을 참조하십시오 .


나는 발견 이 문서가 꽤 일반적를 rvalue 참조의 주제에 계몽 할 수 있습니다. 그는 std::move끝까지 언급합니다 . 이것은 아마도 가장 관련성이 높은 인용문 일 것입니다.

우리는 사용해야 std::move에서, <utility>- std::move, 말하는 방법 "나는 좌변을 알고 하나님 께 정직 좋아,하지만 나는 그것이를 rvalue되고 싶어요." std::move그 자체로는 아무것도 움직이지 않습니다. lvalue를 rvalue로 변환하여 이동 생성자를 호출 할 수 있습니다.


다음과 같은 이동 생성자가 있다고 가정합니다.

MyClass::MyClass(MyClass&& other): myMember(other.myMember)
{
    // Whatever else.
}

statement를 사용할 때 other.myMember반환되는 값은 lvalue입니다. 따라서 코드는 복사 생성자를 사용하여 this->myMember. 그러나 이것은 이동 생성자이기 때문에 그것이 other임시 객체이고 따라서 그 멤버도 있다는 것을 알고 있습니다. 그래서 우리는 더 효율적인 이동 생성자를 사용하여 this->myMember. 를 사용 std::move하면 컴파일러 other.myMember가 rvalue 참조처럼 처리 하고 원하는대로 이동 생성자를 호출합니다.

MyClass::MyClass(MyClass&& other): myMember(std::move(other.myMember))
{
    // Whatever else.
}

std::move유지해야하는 객체 에는 사용하지 마세요. 이동 생성자는 전달 된 객체를 처리 할 수 ​​있습니다. 그것이 임시로만 사용되는 이유입니다.

도움이 되었기를 바랍니다.


T&&rvalue 유형의 객체가 있으면 나중에 다른 사람이 내부 상태에 의존하지 않기 때문에이 객체를 이동해도 안전함을 의미합니다.

이동은 복사보다 비용이 많이 들지 않으므로 거의 항상 이동하고 싶을 것입니다. 그리고 그것을 이동하려면 std::move기능 을 사용해야합니다 .

std::move안전하더라도 언제 피해야 합니까? 예를 들어 다음과 같은 사소한 예에서는 사용하지 않습니다.

 int x = 0;
 int y = std::move(x);

그 외에는 단점이 없습니다. 코드가 복잡하지 않다면 가능한 IMHO로 이동해야합니다.

이동하지 않으려는 또 다른 예는 반환 값입니다. 언어는 반환 값이 (적어도) 이동되도록 보장하므로 작성해서는 안됩니다.

return std::move(x); // not recommended

(운이 좋으면 값 최적화 적중을 반환합니다 . 이는 이동 작업보다 훨씬 좋습니다.)


복사를하지 않고 객체의 내용을 다른 곳으로 "전송"해야 할 때 이동을 사용할 수 있습니다. 객체가 std :: move를 사용하여 복사하지 않고 임시 객체의 내용을 가져 오는 것도 가능합니다.

이 링크 확인

참고 URL : https://stackoverflow.com/questions/14486367/why-do-you-use-stdmove-when-you-have-in-c11

반응형