[C++] 우측값 레퍼런스를 어셈블리로 보면??

prvalue 와 xvalue 의 차이점이 잘 이해가 안되서 살짝 공부해보기로


우측값은 실체가 없는 값이라는 설명을 들은 적이 있지만, 컴파일러의 입장에서는 다른 듯 하다. 7 번째 라인을 보면 스택 메모리의 ebp-78h 위치에 (ebp 는 스택의 시작 주소, 즉 시작지점에서 78번째 아래 있는 부분) 5 값을 저장해두고 있으며, 해당 부분의 주소를 우측값 레퍼런스에 넘겨주고 있다. 우측값 참조되는 값은 분명 메모리 상에 존재하지만 그것을 프로그래머는 알 수 없는 셈


우측값 레퍼런스와 관련해서 빼놓을 수 없는 std::move 명령어는 어떨까.
디스어셈블리로 본다면 그저 넘겨받은 인자의 실 주소값을 그대로 넘겨주고 있다. 사실상 타입변환의 의미만 존재하고 메모리 상에서는 아무 일도 없다.


 다시 생각해본다면 prvalue, xvalue 의 차이점을 이렇게 볼 수 있을 것 같다.

 전체 rvalue 부류에서 prvalue는 프로그래머 입장에서 그 실체 혹은 메모리의 어디에 있는지 확실히 파악할 수 없는 값.
 (리터럴 Int, Char, 값 타입을 반환하는 함수의 반환값, 특정 연산의 결과로 임시로 만들어진 값 등)

 마찬가지로 rvalue 에서 xvalue 란 프로그래머 입장에서 그 실체에 대해 알고 잆는 값
{
   int a = 1;
   int&& rv = std::move(a); // 우측값인 동시에 우리는 a 에 대해 알고 있다.
}

 참조 : https://stackoverflow.com/questions/36827900/what-makes-moving-objects-faster-than-copying
https://www.learncpp.com/cpp-tutorial/15-3-move-constructors-and-move-assignment/

댓글

이 블로그의 인기 게시물

Unity - Dialogue 시스템을 구현할 때 유용한 무료 에셋

Unity - 메타 파일

Unity - 라이브러리 폴더