1. 물체가 움직이는 이유
- 개체를 복사하는 대신 이동을 사용하면 성능이 크게 향상 될 수 있습니다.
- 공유 할 수없는 일부 리소스 개체는 복사 할 수 없지만 이동할 수 있습니다. 예 : IO 클래스 unique_ptr 클래스
2. 개체 이동 방법
2.1 rvalue 란 무엇입니까?
"Lvalue는 지속적이고 rvalue는 수명이 짧습니다."lvalue는 지속적 상태를 가지며 rvalue는 표현식 평가 중에 생성 된 리터럴 상수 또는 임시 객체입니다.
2.2 Rvalue 참조
- rvalue 참조에 바인딩되어야합니다.
- 모바일 운영 지원
- 파괴 할 개체에 대한 스마트 바인딩
- rvalue 참조를 사용하는 코드는 참조 된 개체 리소스를 자유롭게 사용할 수 있습니다.
int i = 42;
int &r = i; //正确,r是i的左值引用
int &r2 = i * 42; //错误,i*42是一个右值
const int &r3 = i * 42; //正确,可以将一个const的引用绑定到一个右值上
int &&rr = i; //错误,不能将一个右值引用绑定到一个左值上
int &&rr2 = i * 42; //正确,将rr2绑定到右值上
int &&rr1 = 42; //正确,字面常量是右值
int &&r2 = rr1; //错误,表达式rr1是左值
2.3 표준 라이브러리 이동 기능
이동 함수는 lvalue를 해당 rvalue 참조 유형으로 명시 적으로 변환하는 데 사용할 수 있습니다.
#include <utility>
int rr3 = std::move(rr1); //正确
2.4 객체 이동을 실현하는 멤버 함수
멤버 함수가 복사 및 이동 버전을 모두 제공하는 경우 한 버전은 const에 대한 lvalue 참조를 허용하고 두 번째 버전은 non-const에 대한 rvalue 참조를 허용합니다.
void push_back(const X&); //拷贝,绑定到任意类型的X
void push_back(X&&); //移动,只能绑定到类型X的可修改右值
inline void StrVec::push_back(const std::string& s)
{
chk_n_alloc(); // ensure that there is room for another element
// construct a copy of s in the element to which first_free points
alloc.construct(first_free++, s);
}
inline void StrVec::push_back(std::string &&s)
{
chk_n_alloc(); // reallocates the StrVec if necessary
alloc.construct(first_free++, std::move(s));
}
전화 예 :
StrVec vec;
string s = "some string or another";
vec.push(s);//调用push(const string &)
vec.push("done");//调用push(string &&)