본문 바로가기

카테고리 없음

ㅣ-value 와 r-value

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 참조라는 것을 제공한다.