c++의 참조자 reference가 어디에 저장되는지 궁금합니다.

dudtkd4567의 이미지

#include <iostream.h>
using namespace std;
 
void change(int &ref) {
ref = 3;
}
 
int main() {
int a=5;
cout<<a<<endl;
change(a);
cout<<a<<endl;
{

이런식으로 코드를 짜면, a는 5에서 3으로 바뀌게 되는데요 이는 C언어 에서는 포인터를 이용해 직접 주소에 접근하지않으면 힘든 일이었습니다. 매우 편한 기능이라 생각이 들긴합니다.

근데 저런식으로 reference로 변수를 받게된다면 과연 저장공간(RAM)에선 어떤 공정을 거쳐 저런 결과를 나타낸 것일까요?

포인터는 직접 해당변수의 시작주소를 받아와 데이터를 저장할 때도 해당 주소를 이정표로 직접 대입했기 때문에 매개변수가 스텍에서 소멸되도 바뀐값은 멀쩡할 수 밖에 없었는데, 위 코드에 a는 어떻게 데이터를 받은걸까요?

위 reference라는 개념은 int &y =x; 일 경우 y는 x의 별칭과 같다는 개념으로 알고 있습니다. 이는 마치 전처리기의 과정과 같은 걸까요?(물론 #이 붙지 않은걸 보면 이는 아니라 생각합니다. 이럼 전처리와 코드간의 경계가 흔들릴테니까요)

혹은 refence를 이용하면 같은 주소를 공유하는 변수가 하나 생성되는 것이라 본다고 가정한다면, 하나의 int형 저장공간에 x 또는 y란 이름이 공존한다. 이렇게 받아들여야 될까요?

개념이 확실치 않아 앞으로 나아가기 불안하네요.
C++선배님들의 지식을 빌리고자합니다.

ktd2004의 이미지

reference도 내부적으로는 pointer로 구현된다고 하네요..

https://stackoverflow.com/questions/3954764/how-is-reference-implemented-internally

dudtkd4567의 이미지

감사합니다. 근데 그 구현이 어떻게 되는건지를 알고싶어요

raymundo의 이미지

윗분 댓글 링크에 있는 코드라면 포인터 지역변수와 완전히 동일하게 스택에 저장되고 있네요.

원 변수의 값을 읽는 것도 포인터 변수를 이용할 때와 마찬가지로, 변수 refToI의 값( i의 주소)을 읽고 그 주소에 있는 값을 다시 읽고 있고요.

포인터 변수ptrToI와의 차이는 *refToI라는 접근을 문법적으로 허용하지 않고(컴파일 에러), &refToI라고 했을 때 refToI 변수의 주소가 아니라 값, 즉 i의 주소를 내어준다는 것이네요.

그런데 저 링크 첫 댓글 보면 항상 이렇게 구현되는 것도 아니고 아마 구현체의 재량껏 할 수 있는 게 아닌가 싶습니다. C나 C++의 많은 부분이 그렇듯이...

좋은 하루 되세요!

drinkme의 이미지

거의 100% 동일하게 컴파일 될겁니다.

void change(int *ref) {
*ref = 3;
}
 
int main() {
int a=5;
cout<<a<<endl;
change(&a);
cout<<a<<endl;
}

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.