-
[C++] L-Value & R-Value프로그래밍/C & C++ 2024. 7. 15. 00:09728x90반응형
R-value와 L-value는 C++에서 값의 카테고리를 구분하는 중요한 개념입니다. 이 두 가지 개념을 이해하는 것은 이동 의미론, 참조, 값 반환 최적화 등을 다룰 때 매우 중요합니다.
L-value (Left Value)
L-value는 메모리 위치를 참조하는 값입니다. 쉽게 말해, L-value는 '왼쪽'에 올 수 있는 값으로, 식의 좌변에 올 수 있는 변수나 참조입니다. L-value는 주소를 가지므로, 해당 위치에 새로운 값을 할당할 수 있습니다.
예시
int x = 10; // 'x'는 L-value x = 20; // 'x'는 식의 좌변에 올 수 있으므로 L-value int* p = &x; // 'x'는 주소를 가지므로 L-value
R-value (Right Value)
R-value는 메모리 위치를 가지지 않는 값입니다. 쉽게 말해, R-value는 '오른쪽'에 올 수 있는 값으로, 식의 우변에 오는 임시 값이나 리터럴입니다. R-value는 보통 값이므로, 해당 위치에 값을 할당할 수 없습니다.
예시
int x = 10; // '10'은 R-value, 'x'는 L-value int y = x + 5; // 'x + 5'는 R-value
R-value와 L-value의 구분
- L-value는 메모리 주소를 가지며, 식의 좌변에 올 수 있는 변수나 참조입니다.
- R-value는 일시적인 값이거나 리터럴이며, 식의 우변에 올 수 있는 값입니다.
R-value 참조와 이동 의미론
C++11부터 R-value 참조(
&&
)를 도입하여 이동 의미론을 지원합니다. 이는 자원을 효율적으로 이동할 수 있게 하여 성능을 최적화하는 데 사용됩니다.R-value 참조
R-value 참조는 R-value에 바인딩할 수 있는 참조입니다. 이는 주로 이동 생성자와 이동 대입 연산자에서 사용됩니다.
#include <iostream> #include <utility> class MyClass { private: int* data; public: // 생성자 MyClass(int value) : data(new int(value)) {} // 소멸자 ~MyClass() { delete data; } // 이동 생성자 MyClass(MyClass&& other) noexcept : data(other.data) { other.data = nullptr; // other를 무효 상태로 설정 } // 이동 대입 연산자 MyClass& operator=(MyClass&& other) noexcept { if (this != &other) { delete data; // 기존 리소스 해제 data = other.data; // 자원의 소유권 이동 other.data = nullptr; // other를 무효 상태로 설정 } return *this; } void print() const { std::cout << "Value: " << (data ? *data : 0) << std::endl; } }; int main() { MyClass a(10); MyClass b = std::move(a); // 이동 생성자 호출 b.print(); // Value: 10 a.print(); // Value: 0 (무효 상태) MyClass c(20); c = std::move(b); // 이동 대입 연산자 호출 c.print(); // Value: 10 b.print(); // Value: 0 (무효 상태) return 0; }
L-value 참조와 R-value 참조의 차이
- L-value 참조 (
T&
): L-value에만 바인딩됩니다. 기존의 C++에서 사용되던 참조 타입입니다. - R-value 참조 (
T&&
): R-value에만 바인딩됩니다. 이동 의미론을 지원하기 위해 C++11에서 도입된 참조 타입입니다.
요약
- L-value: 메모리 위치를 가지며, 식의 좌변에 올 수 있는 값입니다. 변수나 참조가 L-value입니다.
- R-value: 일시적인 값이나 리터럴이며, 식의 우변에 올 수 있는 값입니다.
- L-value 참조: L-value에만 바인딩됩니다 (
T&
). - R-value 참조: R-value에만 바인딩됩니다 (
T&&
).
이 개념들은 C++의 성능 최적화, 특히 이동 의미론을 이해하고 사용하는 데 중요합니다.
728x90반응형'프로그래밍 > C & C++' 카테고리의 다른 글
[C++] const와 constexpr 차이 (4) 2024.07.23 [C++] History (C++11~20) (3) 2024.07.15 [C++] 연산자 다중 정의 (Operator Overloading) (0) 2024.07.08 [C++] Explicit (0) 2024.07.08 [C++] 대입연산자 (0) 2024.07.08