값의 분류(대표적)
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 |