1. Home
  2. 프로그래밍/C++
  3. [C++] 모든 인자값을 레퍼런스로 넘겨야 성능상 유리할까?

[C++] 모든 인자값을 레퍼런스로 넘겨야 성능상 유리할까?

일반적으로 C++에서 레퍼런스를 인자로 받으면, 참조하는 타입의 모든것을 복사하는게 아닌 주소 한번을 넘김으로써 원본에 접근할 수 있어, 포인터 처럼 성능상의 이점을 취할 수 있습니다. 그러면 생각해낸게 "아 그럼 모든 인자는 레퍼런스로 받아야 성능이 좋을까?" 라는 생각이 문뜩들었습니다.

 

매우 큰 객체들은 (Struct, Class 변수) 레퍼런스로 받는게 당연히 빠를 것이나 그럼 int, double 같은 기본 값 타입들도 Call by Value가 아닌 Call by reference 로 받으면 빠르겠구나! 라고 대충 추정해보았습니다. 일단 레퍼런스로 받으면 빠르다라고 배웠으니깐요..

 

그런데 찾아보니깐 아니더라구요.. 이에 관련하여 좋은 글을 작성해주신 분이 있어서 관련 링크를 첨부합니다.

https://blog.naver.com/rapperkjm/221248422323

 

C++] Call by Reference가 무조건 좋은가?

오늘 신입분 한분의 코드를 정리하면서 발견한 코드에서 파라미터로 값을 넘길 때 레퍼런스로 모두 도배를 ...

blog.naver.com

결론부터 말하자면 일반적으로 int, double, float 같은 기본 타입들은 포인터나 레퍼런스로 넘기는 것보다 그냥 Call by Value로 넘기는게 더 좋다고 합니다. 이유는 현대 컴퓨터의 H/W 들에서는 기본 타입들의 변수를 명령어 한번에 값을 복사할 수 있다고 합니다. 그런데 이것들을 레퍼런스로 받으면 쓸데 없는 포인터 연산이 더 추가되어서 (어셈블리 코드가 더 추가되어서) 레지스트리를 낭비하거나 하는 문제가 발생할 수 있다고 합니다.

 

물론 몇 줄의 어셈블리 코드가 추가되는게 성능상에 영향은 사람이 느끼기에 제로에 가깝겠지만, 어쨌든 맹목적으로 "레퍼런스가 무조건 빠르다!" 는 틀린셈이 되겠네요.

 

알면 알수록 심오한 C++의 세계.. 제가 아직 어셈 코드 읽을 실력이 안되서 글을 100%로 이해하진 못했지만 좋은 내용인거 같습니다 ^^

 

주의 : 해당 글에선 CPU의 레지스터를 "레지스트리" 라고 잘못 표기하고 있습니다. 이 정도만 읽는데 주의하세요. CPU의 레지스터와 레지스트리는 엄연히 다른 것 입니다. 레지스트리는 윈도우에서 중요한 시스템 설정값을 저장해두는 데이터베이스이고, CPU의 임시 저장 공간이 레지스터 입니다.

SNS 공유하기
네이버밴드
카카오톡
페이스북
X(트위터)

최근글
인기글
이모티콘창 닫기
울음
안녕
감사
당황
피폐