Modern C++

[C++] R Value 참조와 Move Semantics

태현123 2021. 9. 11. 13:24
728x90
반응형
SMALL

오늘 알아볼 내용은 R Value 참조(R Value Reference)와 Move Semantic이다.

 

우선 간단히 L Value와 R Value가 무엇인지 살펴보면 다음과 같다.

 

LValue : 단일식 이후에도 없어지지 않고 지속되는 객체                  ex) 변수

RValue : 표현식이 종료된 후 더 이상 존재하지 않는 임시적인 값      ex) 상수, 함수의 반환 값

 

말로 하면 역시 이해가 안간다. 코드로 쳐 보는게 가장 좋은 방법이다.

자 에러가 뜨는 곳을 잘 확인해보자.

우선, &연산자는 L Value Reference이므로, 다음(++x)과 같이 썼을 때 컴파일 에러가 난다. 그 이유는, x++는 L Value가 아니라, R Value이기 때문이다. 왜 R Value인가? x++의 경우는 x가 증가되기 전의 복사본을 넘겨주기 떄문에 R Value이다. 반면 ++x는 증가 된 후의 복사본을 넘겨주기 때문에 L Value이다. 그리고, 함수의 반환 값, 상수 값은 모두 R Value이므로, 컴파일 에러가 발생한다. 

&&연산자가 바로 R Value Reference이다. 그래서 R Value Reference로 선언한 k1~k4에서는 반대로 L Value를 참조할 경우 컴파일 에러가 발생한다.

 

그렇다면, 이 R Value Reference가 왜 의미가 있는지에 대해서 알아보자.

 

Move Semantics(이동 의미론)

- Move Semantics의 경우, 객체의 리소스를 다른 객체로 전달(이동)하는 것을 의미한다. 이 Move Semantics을 구현할 수 있게 해주는 것이 바로 R Value Reference이다. R Value는 프로그램에서 어디에 참조될 수 없는 임시객체이지만, 리소스를 객체에게 이동시킴으로써 메모리 할당 / 복사작업을 생략해 성능을 올려준다. 코드를 보는게 이해하기 더 좋을 것 같다.

현재 Person 클래스를 보면, 그냥 생성자와, 복사생성자, 이동생성자가 있다. 그리고 main에서 호출해본다.

 

main 함수

평범한 생성자로 p1을 생성하고, p1을 받는 p2를 복사생성자로 생성했다. p3은 p1를 받는 이동생성자로 생성했다. 그리고 실행 결과를 보면,

실행 결과

p1의 경우 p3으로 string데이터가 이동했기 때문에, 실행결과에서 string이 없는 것을 확인할 수 있다. 

복사 생성의 경우, p1을 깊은 복사해야 하지만, 이동 생성의 경우 p1을 깊은 복사하지 않고, 그대로 이동시켜버리기 때문에 좀 더 좋은 성능으로 구현할 수 있다.

 

-- 좀 더 좋은 예가 있으면 다시 추가할 예정입니다.

반응형
LIST

'Modern C++' 카테고리의 다른 글

[C++] Universal Reference  (0) 2021.09.27
[C++] Thread  (0) 2021.09.20
[C++] Priority Queue - 우선순위 큐  (0) 2021.08.19
[C++] Iterator  (0) 2021.08.16
[C++] 상속  (0) 2021.08.15