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
복사했습니다!