l-value는 변수와 상수만 가능하다.
r-value는 변수와 상수, 수식이 가능하다.
a = 3 + 4;
쉽게 이야기 하면 등호를 기준으로 왼쪽에 있으면 l-value, 오른쪽에 있으면 r-value 이다.
a = 3+4는 가능하지만, 3+4 = a는 불가능하다.
l-value와 r-value의 차이는 수식의 차이이다.
a = 3 + 4;
이것이 어떻게 가능한 것일까?
3 + 4라는 것을 만나면 레지스터에 3과 4 2개를 올리고 연산을 한다.
연산한 결과값을 임시로 만든 공간에 저장하고, 결과값을 a에 복사하는 것이다.
a = b + c + d;
가 있다고 가정해보자.
컴퓨터는 기본적으로 왼쪽 부터 연산한다.
b + c를 먼저하고,
(b+c)의 결과값으로 다시 d를 더한다.
레지스터 1 , 2가 있다고 가정하면
레지스터 1에 b의 값을 저장한다.
레지스터 2에 c의 값을 저장한다.
b+c의 결과값을 임시 공간 t1에 저장한다.
다시 레지스터1에 t1의 값을 저장한다.
레지스터 2에 d의 값을 저장한다.
t1+d의 결과값을 임시 공간 t2에 저장한다.
t2의 값을 a에 복사한다.
이런 과정을 거치는 것이다.
왜 이런 과정을 거칠까?
cpu는 수많은 논리게이트로 이루어져 있다.
실제 논리게이트는 이것보다 훨씬 복잡하지만 덧셈 논리게이트를 간단히 보면 이런 형태이다.
b + c + d라면 이 덧셈연산(논리게이트)를 두번 써먹는 것이다.
위 게이트를 보면 2개의 입력을 받아서 하나의 결과가 나온다.
따라서 b+c = t1
t1 + d = t2
로 되는 것이다.
c++에서 말하는 r-value란 임시객체(임시공간)를 말한다.
임시객체는 우리가 임의로 조작할 수 없다. 컴퓨터가 알아서 생성하고 삭제한다.
r-value는 주로 얕은 복사,깊은 복사와 관련이 있다.
위에서 임시객체가 2번 생성되었고, 값 대입은 총 3번 일어난다.
만약 a,b,c,d가 커다란 이미지객체라면 이는 매우 비효율적이다.
이럴 경우 주로 얕은 복사를 사용하지만, 의도치 않게 깊은복사를 할때가 문제이다.
그래서 c++ 에서는 r-value 참조라는 것을 제공한다.