C++ 참조자 이 씨발련을 알아보자

보통 참조자하면 뭐냐?

기존의 변수에 별칭을 하나 더 만들어서 해당 변수를 조작 할 수 있게 해주는 문법적 장치를 의미한다.

근데 보통 CPP 표준 말고 아무 문서 잡아다가 주워보면 (레퍼런스는 공간을 차지하지않습니다.) 라는 말을 통상적으로 적어놓는데

이 글을 곧이 곧대로 믿으면 오산이다

예시를 알아보자

int A = 5;


int &C = A;

이 경우엔 정말 메모리 공간을 차지하지않는다.

x64 ISA로 보면

[rbp-0x4]에 A가 존재한다 치자

이러면 별도로 C도 컴파일러 상에서 [rbp-0x4]로 똑같이 적어주면 된다. 그럼 별도의 공간이 필요없이 정말 앞전에 이야기 했듯이 하나의 별칭 alias가 생긴거니까 말이다.

하지만 이러면 말이 달라진다.

void Sex(int &A)  라는 함수가 존재했을 때

이 섹스 함수의 파라미터는 A라는 참조자다 .

함수 호출 될 때는 함수 호출 규약 즉 Calling Convetion (김대중 컨벤션) 이라는 걸 따르는데.

앞서 말했듯 x64 기준으로 fastcall 규약에서 함수의 첫번 째 인자는 RCX라는 레지스터를 이용해 사용된다.

좀 이상하다 이기 앞에선 분명 (참조자 이 씨발련은 별도의 공간이 필요없당께) 라고 적어놨으니 말이다.

하지만 여기서 큰 오산이 있다 cpp 표준에서는 참조자 자체가 특별한 경우엔 자원을 점거 할 수 있다고 명시되어있다.

위와 같은 경우가 특별한 경우이다. (사실상 포인터 변수 선언해서 던진거랑 같음) 그리고 RCX 라는 CPU의 작은 메모리 단위를 점거하니깐 말이다.

그래서 결론은 뭐냐고? 아무 문서 줏어다가 보지마라 표준을 보거라 이기야 삼기야