1. 값의 이동
데이터의 소유권을 옮기는 것.
포인터를 옮기고, 원본 데이터를 nullptr로 교체하는 것으로 구현한다.
2. 복사 생성자 (copy constructor)
복사를 통하여, 같은내용의 새로운 객체를 만드는 생성자.
아래 두 객체의 data는 내용은 같지만, 주소는 다르다.
3. 이동 생성자 (move constructor)
이동을 통하여, 같은내용의 새로운 객체를 만드는 생성자.
소유권이 변경되어야 하므로, 원본 객체의 데이터는 사라졌지만.
데이터를 그대로 사용했으므로, 주소는 변하지 않는다.
4. 임시객체 이동 생성자 (rvalue reference move constructor)
우측값은 임시객체의 특징을 갖는다.
내용을 복사하는 것 보단, 이동시키는 것이 낫다.
5. 좌측값, 우측값 이동 생성자
이동 생성자는 우측값으로 생성하는 것이 좋다.
좌측값은 나중에 사용될것이라는 의미를 내포하기 때문.
더 이상 사용하지 않을 좌측값을 넘겨야 한다면,
우측값 참조로 캐스팅하여 임시객체로 간주한다는 문맥을 넘긴다.
6. 이동 생성자 설계 원칙
디자인 원칙
- 우측값으로 받는다.
- 자기 자신에 대한 이동을 막는다.
- 값을 이동하고, 제공자의 데이터를 nullptr로 교체한다.
example :
class DataBox { private: int *data = nullptr; public: DataBox(DataBox&& other) { if(this != &other){ this.data = other.data; other.data = nullptr; } } ~DataBox(){ /// delete nullptr; 은 아무런 부작용이 없다. delete data; } }
7. 이동 의미론 (Move Sementic)
이동을 주체로 한 동작방식.
시맨틱의 종류
- 무브 시맨틱 -> 생성자에 적용하면 이동 생성자.
- 카피 시맨틱 -> 생성자에 적용하면 복사 생성자.
8. STL에 적용된 이동 의미론
vector
- push_back, emplace_back에 우측값 참조를 던져서 내부 데이터를 이동.
- emplace_back에서 생성자 인자형식에 맞게 던져서 데이터를 하나씩 이동.
참고문헌
'# Lang > C++' 카테고리의 다른 글
6.1 로컬변수 초기화 (0) | 2019.04.22 |
---|---|
5.2 완벽한 전달 (0) | 2019.04.19 |
4.3 우측값 참조 (rvalue reference) (0) | 2019.04.16 |
4.2 값의 유형 (glvalue, prvalue, xvalue) (0) | 2019.04.11 |
4.1 표현식 (0) | 2019.04.10 |