
Move Semantic 은 C++ 11에서부터 도입된 특징이며, 비싼 복사 연산과 임시 객체 생성을 컴파일러가 이동 연산으로 대체할 수 있게 한다. 물론 클래스 안에서 이동 생성자와 이동 연산자가 구현되어 있어야 한다.
- Value Category
- 일반적으로 C++에서 expression은 연산자(operands)와 피연산자(encompasses operators), 리터럴(literals)과 변수 이름(variable names)을 말한다.
- expression은 type catecory와 value category로 나뉜다.
- expression은 identity라고 하는 개념을 가질 수 있으며, identity를 통해서 expression간에 비교를 할 수 있다. 예를 들어, 객체 간의 주소를 비교하거나, 함수 간에 주소를 비교하는 식으로 말이다.
- lvalue : identity를 가지지만, 이동연산이 불가능한 expression
- xvalue : identity를 가지면서, 이동연산도 가능한 expression
- prvalue : identity를 가지지 않지만, 이동연산이 가능한 expression
- identity를 가지는 expression들을 glvalue(generalised lvalue)라고 부르며, xvalue와 lvalue는 glvalue에 포함된다. 이동 연산이 가능한 prvalue와 xvalue는 rvalue에 포함된다.
- std::move는 사실은 어떠한 객체도 이동시키지 않는다. 단지 새로 정의된 rvalue reference(수정가능한 rvalue) 타입으로 형 변환을 수행한다. rvalue reference는 더 이상 필요하지 않은 임시 객체이며, 리소스가 훔쳐진다라는 개념도 여기서 나온 것이다. C++에서는, STL 컨테이너간의 range based 데이터(이터레이팅이 가능한 데이터)들을 이동시킨다거나, 일반화된 타입을 특정 타입으로 변환하는 식으로 사용한다.

'C++' 카테고리의 다른 글
C++ 클래스의 메모리 오버헤드 (0) | 2023.06.16 |
---|---|
[C++] Iterator, 반복자 (1) | 2022.09.19 |
[C++14] Virtual Inheritance (0) | 2022.09.18 |
[C++20] Concepts (0) | 2022.09.17 |
값 카테고리, 타입 카테고리 (0) | 2022.07.04 |