Doby's Lab

[C++] 참조자(&)에 대하여, 포인터와는 전혀 다른 개념 본문

C++

[C++] 참조자(&)에 대하여, 포인터와는 전혀 다른 개념

도비(Doby) 2021. 11. 19. 11:04

https://draw-code-boy.tistory.com/101

 

[알고리즘] 백준 2407번: 조합 (C++), Combination, Permutation

https://www.acmicpc.net/problem/2407 2407번: 조합 n과 m이 주어진다. (5 ≤ n ≤ 100, 5 ≤ m ≤ 100, m ≤ n) www.acmicpc.net 이번 문제는 (https://jaimemin.tistory.com/682)을 참고한다. 개념 학생..

draw-code-boy.tistory.com

이 문제를 풀면서 솔루션을 참고하다가 공부하게 된 내용이다.

우선 &를 쓴다는 점에서 포인터라고 생각했지만 전혀 다른 개념을 사용된다.

 

변수의 의미는 '메모리 공간에 이름을 붙인 것'이다.
참조자는 똑같은 메모리 공간에 다른 이름을 붙인 것과 같다.

>> 즉, 어느 선언된 변수와 똑같지만 이름만 다른 것이라고 할 수 있다.

 

같은 메모리 공간을 공유하기 때문에 참조 변수에 연산을 해도 원래 변수에도 똑같은 연산이 된다.

#include <iostream>
using namespace std;

int main() {
	int num1 = 10;
	int& num2 = num1;

	num2 += 10;

	cout << num1 << ' ' << num2;

	return 0;
}
[Output]
20 20

왜 참조자는 다른 변수 선언보다 더 빠른가?

이유는 (https://www.acmicpc.net/board/view/7686) 이 글에서 상세히 설명되어있다.

int a = b;
int &a = b;

int a = b는 새로운 메모리 할당, 값 복사를 하는데 반해, int &a = b는 주소 값만 복사를 하기 때문에 빠르다는 의견이 있었지만 더 정확한 설명에서는 컴파일러 입장에서 int &a = b는 O2 최적화로 인해 삭제가 된다고 한다.

즉, int &a = b는 컴파일이 될 때, 같은 주소 값을 쓰고 있기 때문에 b로 치환되어서 성능이 상향된다고 한다.

그에 반해 int a = b는 새로운 메모리를 할당하기 때문에 int &a = b와 차이를 보인다고 한다.

(물론 int a = b도 시간을 크게 잡아먹지 않는다.)


느낀 점

아무래도 참조자는 코딩을 할 때 결괏값을 담을 변수로 보기 편하게끔 딱 거기까지 역할로 사용할 거 같다.

포인터와는 완전 다른 개념이라는 것을 인지해두자!

 

참조자를 알고 나서 인지 함수 호출 방식 Call-By-Reference가 왜 더 빠른지 조금 이해가 된 거 같다.

728x90