모두의 코드 커뮤니티

[C++ 질문] 상수 레퍼런스로 리턴값을 받게 되면 해당 리턴값의 생명이 연장됩니다. 에 대한 질문입니다

씹어먹는 C++ - <2. C++ 참조자(레퍼런스)의 도입>
위 강의를 보고 궁금한 점이 생겼는데, 내용이 길어 커뮤니티에 질문 납깁니다.

강의 중에

하지만 예외적으로 상수 레퍼런스로 리턴값을 받게 되면 해당 리턴값의 생명이 연장됩니다. 그리고 그 연장되는 기간은 레퍼런스가 사라질 때 까지 입니다.
라는 내용이 있는데요.
함수 콜에서 지역 변수는 스택의 윗부분에 생성되었다가 eax register에 담아서 return해주는 것으로 기억하는데요.

위 사이트에서 아래 코드를 어셈블리언어로 컴파일해봐도
#include

int function() {
  int a = 5;
  return a;
}

int main() {
  const int& c = function();
  int d = c + 1;
  return d;
}

아래와 같이 나옵니다.
function():
push rbp
mov rbp, rsp
mov DWORD PTR [rbp-4], 5
mov eax, DWORD PTR [rbp-4]
pop rbp
ret
main:
push rbp
mov rbp, rsp
sub rsp, 16
call function()
mov DWORD PTR [rbp-16], eax
lea rax, [rbp-16]
mov QWORD PTR [rbp-8], rax
mov rax, QWORD PTR [rbp-8]
mov eax, DWORD PTR [rax]
add eax, 1
mov DWORD PTR [rbp-12], eax
mov eax, DWORD PTR [rbp-12]
leave
ret

어셈블리 코드를 보면 eax레 return된 값을 mov DWORD PTR [rbp-16], eax 명령어로 스택에 가져오고
lea rax, [rbp-16]
mov QWORD PTR [rbp-8], rax
이 두 명령어로 rax register, [rbp-8] stack에 해당 값을 집어넣는 걸로 보이는데요.
여기서 main 함수에서 const int& type으로 return을 받는 것이 어떤 의미가 있는지 궁금합니다.

감사합니다.

profile email Best

그냥 단순히 규칙을 설명하는 글 아닌가요?

위 내용과 같이 해당 함수가 끝나면 바로 사라지는 레퍼런스를 반환 할 수 없고, 상수 레퍼런스는 해당 레퍼런스가 사라지기 전까지 살아있으니, 생명이 연장된다고 표현 된 것으로 보여요. 저 글에는 설명이 더 없으니 그냥 하나의 규칙이다~ 이런 말이 아닐까요? const 붙이면 살려줄게~ 같은 …
저는 잘 모르겠네요 : (

좋아요 1

딱히 의미는 없습니다. 그냥 상수 레퍼런스로 받으면 라이프타임이 연장된다는 이야기를 하고 싶었습니다.

좋아요 1

의미 없는 하나의 규칙이 맞는건가요?

좋아요 1

역시 의미가 없군요
두 분 모두 답변 감사드립니다! :slight_smile: