ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C++] L-Value & R-Value
    프로그래밍/C & C++ 2024. 7. 15. 00:09
    728x90
    반응형

    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의 구분

    1. L-value는 메모리 주소를 가지며, 식의 좌변에 올 수 있는 변수나 참조입니다.
    2. 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
Designed by Tistory.