R-value 참조에 대해서 질문이 있습니다.
r-value 참조에 대해서 질문이 있습니다. (02-rvalueRef 예제 강의 기준 r-value 참조 (임시 객체와 유효범위) 8분)
코드를 포인터를 볼 수 있게 조금 수정했습니다.
int testFunc(int param)
{
int result = param * 2;
std::cout << &result << std::endl;
return result;
}
int&& result = testFunc(10);
std::cout << result << "pointer: " << &result << std::endl;
임시 객체의 주소를 지우지 않고 가져다 쓰는것이라 하셔서 testFunc 함수의 return 하는 result 의 포인터를 확인 후
받는 result의 포인터가 같은지를 확인해 보았습니다.
print된 2개의 result의 포인터 값이 다른 것을 확인했습니다.
혹시 임시 객체라는 것이 함수의 return result 값을 또 다른 포인터로 옮긴 뒤 받기 때문에 return result와 다르게 되는건가요?
답변 2
0
임시객체의 주소를 지우지 않는 것이 아니라 임시객체 자체를 소멸시키지 않는 것입니다. 참조자는 특정 인스턴스에 대해 존재합니다. 즉, 참조 대상이 반드시 존재해야 합니다. 그리고 testFunc() 함수의 지역변수인 result는 testFunc() 함수바디 스코프에서 유효한 인스턴스 입니다. 그러나 이 변수에 저장된 값이 호출자 함수인 main() 함수에 반환되면서 같은 값을 같는 이름이 없는 int 인스턴스가 필요합니다. 다시 말하지만 result는 main() 함수 지역변수가 아니기 때문입니다.
이렇게 생성된 임시객체는 해당 구문이 끝나면 소멸하는 것이 원칙이나 참조자가 존재할 경우 Lifetime이 참조자 유효범위까지로 확대됩니다.
질문이 생긴 원인은 int 인스턴스가 호출자, 피호출자 각각에 존재한다는 점을 잘못이해해서 발생한 것으로 보입니다. 참고하시기 바랍니다.
0
안녕하세요, 인프런 AI 인턴입니다.
이정민님, r-value 참조에 대한 질문 감사합니다.
함수 testFunc 안에서 result를 선언하고 반환하는 순간, result는 스택에 임시로 생성된 지역 변수입니다. 함수가 종료되면 이 지역 변수는 사라지며, 해당 변수의 메모리 주소 역시 유효하지 않게 됩니다. 그러나 int&&를 사용하여 r-value 참조를 받을 경우, 일반적으로 임시 객체에 대한 참조가 만들어지게 됩니다. 이때, 컴파일러 최적화의 일환으로 임시 객체의 수명이 연장될 수 있으며, 이를 임시 수명 연장(temporary lifetime extension) 이라고 합니다.
따라서, int&& result = testFunc(10); 에서 result는 임시 객체의 값으로 초기화 되지만, 이 값은 원래 함수 내부 result의 사본입니다. 그래서 출력된 두 포인터의 값이 서로 다른 것을 확인할 수 있습니다. 함수가 반환하는 임시 객체의 값은 새로운 임시 객체로 이전되기 때문에, 포인터 값이 결과적으로 다른 것입니다.
testFunc에서 반환된 임시 객체(result)는 r-value 참조 변수로 바인딩되어 있기 때문에 그 수명이 연장되어 사용될 수 있는 것이지만, 이는 원래 testFunc 내부의 result 변수와는 다른 메모리 주소를 갖게 되는 것입니다.
이해를 돕기 위해 대상과 관련한 이미지 및 자료가 제공됩니다:
강의 수강 페이지로 이동하기
관련된 부분을 더 깊게 공부하시려면 C++의 임시 객체 수명 연장과 r-value 참조에 관한 부분을 더 상세하게 다루는 자료를 찾아보시길 권장드립니다.
인터페이스 상속과 추상 자료형 2:00 질문
0
50
1
13분 42초의 예제
0
52
2
네임스페이스 스코프 내에서 정의된 변수, 함수들이 위치하는 곳 질문
0
47
1
소멸자 가상함수 질문
0
55
2
이동생성자의 매개변수로 넘어가는 임시객체의 값 유지 관련하여 질문이 있습니다.
0
63
2
임시 객체 복사 생성자 질문드립니다
0
66
2
변수 바인딩에 대한 의문점
0
113
1
C++ 파일 구조 질문
0
128
1
빈 포인터에 멤버함수 호출
0
104
1
파생클래스에서 virtual함수를 선언에 대한 질문입니다.
0
116
2
순수 가상 클래스 선언과 일반 인트 변수의 선언과 다른가요?
0
137
2
안녕하세요. 이동의미론에 대해 제가 잘 이해했는지 궁금합니다.
0
132
1
인스턴스의 개념에 대해 int a(3), int(5) 예시를 바탕으로한 질문입니다.
0
189
2
식별자 검색 순서 관련 namespace 생략 관련 오류에 관한 질문
0
175
1
마지막 주소록 예제 c 파일 한글 깨짐 현상
0
190
1
nullprt vs null
0
153
2
쓸데없지만 질문드리고싶습니다
0
181
1
복사 생성자 질문 드립니다.
0
221
1
생성자 궁금한거 있습니다
0
218
2
단순대입 오류 발생 이유
0
235
1
네가지 형변환 강의 질문
0
283
1
CMyString Step10 강의 질문
0
174
1
임시 객체와 보이지 않는 복사 생성 강의 질문
0
268
2
섹션8 3번째 강의 (실습 프로젝트 - 문자열 필터개선) 질문
0
219
2





