C ++ Primer 5th notes (13 장 복사 제어) 개체 이동

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 &&)

추천

출처blog.csdn.net/thefist11cc/article/details/113878388