l-value와 r-value 정리입니다.
구글링 및 ChatGPT의 도움을 받아 작성했습니다.
1. 한 문장 정의
- l-value: → 메모리에 이름이 있고, 다시 접근할 수 있는 값
- r-value: → 임시로 생성되며, 이름이 없고 곧 사라질 값
2. 코드로 보는 차이
int a = 10;
// a → l-value
// 10 → r-value
a = 20; // OK
10 = a; // 컴파일 에러
👉 l-value는 대입의 왼쪽에 올 수 있다.
3. 메모리 관점에서의 차이
l-value
- 메모리 주소가 있음
- 수명이 명확함
- 참조 가능
r-value
- 임시 객체
- 표현식이 끝나면 소멸
- 주소를 직접 잡기 어려움
4. 참조(&, &&)와의 관계
l-value reference (T&)
void Func(int& x);
- l-value만 받을 수 있음
- 기존 객체 수정 가능
r-value reference (T&&)
void Func(int&& x);
- r-value만 받을 수 있음
- 이동(move) 대상
👉 C++11 이후 성능 최적화의 핵심
불필요한 복사를 피하고, 임시 객체의 자원을 재사용할 수 있다!
5. 이동 시맨틱과 게임 프로그래밍
왜 중요한가?
게임에서는 다음이 매우 빈번하다.
- 큰 컨테이너 반환
- 임시 객체 생성
- Tick 단위 반복 호출
복사가 계속 일어나면:
- 성능 저하
- 메모리 낭비
예시
std::vector<int> CreateData();
- 반환값은 r-value
- 복사 대신 move 가능
std::vector<int> data = CreateData();
// 반환값은 r-value, 이동 가능
👉 게임 로딩, 리소스 생성에서 매우 중요
6. Unreal Engine 관점
- MoveTemp() → 명시적 r-value 캐스팅
- TArray, TMap 이동 최적화
TArray<int32> A = CreateArray();
TArray<int32> B = MoveTemp(A); // A는 더 이상 유효 데이터 없음
7. 한 문장 정리
l-value는 지속적인 메모리 위치를 가진 값이고, r-value는 일시적인 임시 값입니다. C++에서는 이를 구분하여 복사 대신 이동을 가능하게 함으로써 성능을 최적화합니다.
'GameDevelop > Notes' 카테고리의 다른 글
| 해시테이블과 해시충돌 (0) | 2026.01.09 |
|---|---|
| A* 알고리즘 (0) | 2026.01.05 |
| 쿼터니언(Quaternion) vs 오일러 각(Euler Angle) (0) | 2026.01.01 |
| 벡터의 내적과 외적 (0) | 2026.01.01 |
| RAII - Resource acquisition is initialization (0) | 2024.09.10 |