이동 연산
좌변 값을 우변 값과 분리해서 처리하자는 것입니다.
복사대입과 복사 생성좌는 좌변값을 받으들이는 반면, 이동 대입과 이동 생성자는 우변값을 받아 들입니다.
class Move
{
public :
int data=-1;
public :
Move()
{
cout << "생성자"<<endl;
};
~Move()
{
cout << "소멸자" << endl;
};
Move(Move&& d)
{
cout << "이동 생성자" << endl;
};
Move(Move& d)
{
cout << "복사 생성자" << endl;
};
Move& operator=(Move &&other)
{
if (this == &other)
return *this;
data = other.data;
cout << "rvalue" << endl;
return *this;
}
};
int main()
{
Move *mv1= new Move();
cout << mv1<<endl;
mv1->data = 10;
Move *mv2=new Move(*mv1);
cout << mv2 << endl;
Move *mv3=new Move(std::move(*mv1));
cout << mv3 << endl;
mv3->operator=(std::move(*mv1));
delete mv1;
delete mv2;
delete mv3;
return 0;
}
차이점
이동 연산은 복사 연산에 비해 상당히 간단하고 좀더 효율적인 편입니다.
최적화로써 좋습니다.
특히 이동 연산자는 예외던지기를 하지 않습니다.
복사가 아닌 이동 연산을 사용해야 할떄는 언제 일까요?
반환값과 같은 몇가지 경우에는 언어 규칙에 정해져 있습니다.
하지만 일반적으로 우변값 참조자를 통해 컴파일러에게 알려줘야 합니다.
std::move()는 우변값 참조자 를 반화하는 표준 라이브러리 함수입니다.
표준 라이브러리 컨테이너는 이동연산을 갖고 있으며 pair(), unique_ptr,같은 표준 라이브러리 타입도 마찬가지입니다.
insert나 push_back같이 새로운 원소를 표준 라이브러리 컨테이너에 삽입하는 연산들은 역시 우변값을 받아들이는 버전을 가지고 있습니다.
결과로는 복사보다 이동이 더 우수한 수준의 성능을 보여줍니다.
'프로그래밍언어 > C++' 카테고리의 다른 글
c++11 char (0) | 2021.07.13 |
---|---|
char*->int (0) | 2021.03.06 |
<c++>레지스터 변수 (0) | 2020.10.15 |
<c++>decltype (0) | 2020.10.14 |
오버로딩 (0) | 2020.10.04 |