티스토리 뷰

 

C++ 의 reference는 

1. 이미 존재하는 변수의

2. 메모리 주소를 저장한다.(포인터처럼)

 

이미 존재하는 대상의 주소를 그 녀석의 다른 이름으로 사용되는 것인데,

도입된 이유는 할당이 일어나는 상황에서(함수의 인자로 넘겨지는 경우도 포함하여) 메모리 문제와 관련 있다. 

 

C/C++ 에서는 할당의 기본이 Call-by-Value 이다. 쉽게 말해 원본이 아닌 카피본을 쓴다는 뜻이다. 

어떤 타입을 aType 이라 하자. (int, double 처럼 제공되는 타입이든 사용자 정의든 상관없다.)

 

aType x=a;

 

위의 평범한 할당문은 a 라고 이름 붙은 메모리의 내용을 x 라고 이름 붙은 메모리로 복사한다.

이후 메모리 a,x 에는 같은 정보가 기록되어 있을 뿐 서로 영향을 주지 않는다. 

a 를 변경하거나 메모리를 해제 했을 때, x 에는 아무 영향이 없고 반대도 마찬가지. 

 

메모리를 적게 잡아먹는 경우에는 문제가 없지만 aType 의 덩치가 커지면 문제가 된다. 

같은 block(name space) 에서의 할당보다 함수의 인자로 매개변수에 할당된 경우가 이해하기 쉬우니 그 경우를 보자.  

 

함수의 인자로 넘겨진 경우

text 를 넘겨 받아 오타가 존재하는지 여부를 확인만 하는 function 이 있다고 하자. 

짧은 문장이라면 복사해서 넘기거나 원본을 넘기거나 큰 문제가 안된다.

 

하지만 수십 메가 바이트의 굉장히 긴 자료의 경우에, call-by-value 로 호출은 카피본을 넘겨주니

호출하는 함수와 호출되는 함수 양쪽에 같은 자료가 각각 메모리를 차지하게 된다.

변경을 하지 않기에 훼손될 가능성이 없는 경우에도 불필요한 메모리 낭비가 일어나는 것이다. 

 

변경 작업을 허용해야 하는 function 의 경우에는 상황이 더 나쁘다.

카피에 변경을 해봐야 원본은 변경되지 않는다!

원본을 변경하려면 어찌하나?

 

Pointer

원본의 주소를 넘겨주어 호출된 함수에서 access 할 수 있게 해주는 장치가 pointer 였다. 

문제는 pointer 는 매개 변수와 de-referencing 에는 * 를 사용하고,

인자로 넘길 때 일반변수를 &를 붙여서 넘겨야 하는 등 문법이 복잡하다. 

 

Reference

그리하여  주소를 저장하지만 알아서 de-referencing 을 해주는

constant pointer 비스무리한 것을 만든 것이 reference 이다. 

 

이렇게 되면 자동적으로 강제되는 것들이 생긴다.

constant pointer 의 성격을 가지므로 변경이 불가능한 일회용이다.

이미 존재하는 변수를 지정하는 순간 재할당이 안된다. 

 

그럼 다음 code 에서 메모리 할당은 어떻게 이루어질까?

 

 

#include<cstdio>
using namespace std;

struct Obj {
    Obj() { for(int i=0;i<1000;i++) arr[i]=i;}
    int arr[10000];
};

void func(Obj &r){
    for(int i=0;i<10;i++) printf("%d\n", r.arr[i]);
}

int main() {
    Obj obj;
    Obj &r=obj;

    func(r);
}

 

struc Obj 는 메모리를 많이 잡아 먹는 덩치 큰 녀석이다. ( int 타입 10000 개를 저장)

만약 reference 가 아닌 변수를 함수에 넘기게 설계하면 함수 호출시 

stack 에 그 만큼의 메모리를 확보해야 한다.

 

하지만 위의 코드는 매개변수가 reference 이므로 func 은 pointer 변수 크기만큼만 stack 에 추가하면 된다.

그런데, main 에서는 어떨까? 

reference r 은 메모리를 차지할까? NO!

컴파일 타임에 포인터로 변경되어 모든 코드가 처리된다. 

 

같은 블록 안에서 사용된 reference 는 메모리를 차지하지 않는다. 

 

 

다른 언어의 reference (사실 전혀 다른 개념이지만..)와의 차이점은 다음에 살펴 보자.

 

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함