이동 생성자 및 이동 대입 연산자

2022. 2. 19. 19:23C++

값의 분류(대표적)

1. lvalue

지속적으로 유지되는 개체

2. rvalue

lvalue가 아닌값, 일시적인 값 ex) 람다

 

rvalue 참조 (&&)

- 임시적인 값을 참조로 쓰겠다.

- C++11이후 나옴

- 기능상 &연산자와 비슷

- & 연산자 -> lvalue 참조, &&연산자 -> rvalue 참조

 

std::move()

- rvalue 참조로 반환

- lvalue를 rvalue로 변환

 

이동 생성자

<class_name>::<class_name>(<class_name>&&)

- 다른 개체 멤버 변수들의 소유권을 가져 옴

- 복사 생성자와 달리, 메모리 재할당 x

- 복사 생성자보다 빠름

- 약간 얕은 복사와 비슷하다.

-> Mystring::MyString(MyString&& other) {...}

 

rvalue 최적화

- 이동 생성자와 이동 대입 연산자

=> 아직 쓰임(유니크 포인터, move)

- 포인터 대신 개체 자체를 반환하는 함수

-> 함수에서 rvalue를 반환하는 것이 실제로는 매우 느림

-> 반환 값 최적화(Return Value Optimization)라고 하는 컴파일러 최적화를 깨기 때문

=> 자세한 것은 Named RVO 검색

-> 그래서 그냥 쓰는 방식(lvalue)를 쓰자 대신,

1. 반환 값 최적화가 안되는 경우

2. 너무 느려서 특정 함수가 rvalue가 더 빠른 경우

같은 경우만 rvalue를 반환하도록 사용하자

'C++' 카테고리의 다른 글

람다 식(Lambda Expression)  (0) 2022.03.03
C++ constexpr  (0) 2022.03.02
C++ 스마트 포인터  (0) 2021.12.28
C++ STL  (0) 2021.12.27
C++ 새로운 자료형  (0) 2021.12.26