인프런 커뮤니티 질문&답변

날다람쥐님의 프로필 이미지
날다람쥐

작성한 질문수

C개발자를 위한 최소한의 C++

r-value 참조 (임시 객체와 유효범위)

R-value 참조에 대해서 질문이 있습니다.

해결된 질문

작성

·

295

0

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 참조에 관한 부분을 더 상세하게 다루는 자료를 찾아보시길 권장드립니다.

날다람쥐님의 프로필 이미지
날다람쥐

작성한 질문수

질문하기