L, R value

김대익·2022년 2월 24일

call by value 보다 call by reference가 효율적인 이유


L value는 다른 명령에서 사용될 수 있는 경우
R value는 데이터 값처럼 한 번만 사용되는 경우이다.

std::move를 사용하면 L value를 R value로 바꿀 수 있다.
(ex. int a = std::move(a);)


빨간 밑줄을 친 것처럼 R value reference를 받는 &&인수에 L value를 넣으면 에러를 내뿝는다.
따라서 R value인 "123"처럼 직접 값을 넣거나 std::move(a)처럼 R value로 바꿔서 인수로 넣어주면 된다.


먼저 storeByValue함수의 실행 과정을 살펴보자

위쪽이 stack이고 아래쪽이 heap이라하면
main이 stack frame을 생성하면서 heap 저장위치를 저장하고, heap에는 a의 값인 "abc"를 저장한다.
그 후 인수를 저장하려하는데 인수 s를 value로 받았으니 stack frame을 생성하면서 s를 만들고 heap에 값"abc"를 저장한 뒤 s에는 포인터를 저장한다.
마지막으로 string b = s;에서 stack frame을 생성하고 b를 저장하기 위해 또 heap에 "abc"를 저장하고 stack의 값은 저장한다.


storeByLRef의 경우

인수의 경우 a가 가리키는 heap공간을 같이 가리키므로 "abc"를 한번만 복사한다.


storeByRRef의 경우


먼저
인수 s는 L value이므로 move를 사용하여 R value로 바꿔주면 &&s가 R value로 바뀌는 것을 알고
b는 기존에 저장된 "abc"를 가리키게 되어 복사를 전혀 하지 않게된다.

0개의 댓글