일반적으로 C++에서 레퍼런스를 인자로 받으면, 참조하는 타입의 모든것을 복사하는게 아닌 주소 한번을 넘김으로써 원본에 접근할 수 있어, 포인터 처럼 성능상의 이점을 취할 수 있습니다. 그러면 생각해낸게 "아 그럼 모든 인자는 레퍼런스로 받아야 성능이 좋을까?" 라는 생각이 문뜩들었습니다.
매우 큰 객체들은 (Struct, Class 변수) 레퍼런스로 받는게 당연히 빠를 것이나 그럼 int, double 같은 기본 값 타입들도 Call by Value가 아닌 Call by reference 로 받으면 빠르겠구나! 라고 대충 추정해보았습니다. 일단 레퍼런스로 받으면 빠르다라고 배웠으니깐요..
그런데 찾아보니깐 아니더라구요.. 이에 관련하여 좋은 글을 작성해주신 분이 있어서 관련 링크를 첨부합니다.
https://blog.naver.com/rapperkjm/221248422323
결론부터 말하자면 일반적으로 int, double, float 같은 기본 타입들은 포인터나 레퍼런스로 넘기는 것보다 그냥 Call by Value로 넘기는게 더 좋다고 합니다. 이유는 현대 컴퓨터의 H/W 들에서는 기본 타입들의 변수를 명령어 한번에 값을 복사할 수 있다고 합니다. 그런데 이것들을 레퍼런스로 받으면 쓸데 없는 포인터 연산이 더 추가되어서 (어셈블리 코드가 더 추가되어서) 레지스트리를 낭비하거나 하는 문제가 발생할 수 있다고 합니다.
물론 몇 줄의 어셈블리 코드가 추가되는게 성능상에 영향은 사람이 느끼기에 제로에 가깝겠지만, 어쨌든 맹목적으로 "레퍼런스가 무조건 빠르다!" 는 틀린셈이 되겠네요.
알면 알수록 심오한 C++의 세계.. 제가 아직 어셈 코드 읽을 실력이 안되서 글을 100%로 이해하진 못했지만 좋은 내용인거 같습니다 ^^
주의 : 해당 글에선 CPU의 레지스터를 "레지스트리" 라고 잘못 표기하고 있습니다. 이 정도만 읽는데 주의하세요. CPU의 레지스터와 레지스트리는 엄연히 다른 것 입니다. 레지스트리는 윈도우에서 중요한 시스템 설정값을 저장해두는 데이터베이스이고, CPU의 임시 저장 공간이 레지스터 입니다.
'프로그래밍 > C++' 카테고리의 다른 글
[Arduino/C++] 시리얼 모니터 데이터 공백구분으로 입력받기, 명령어 처리 (0) | 2022.11.12 |
---|---|
[C++] 연산자 오버로딩 (Operator Overloading) (0) | 2022.11.09 |
[C/C++] 선언(Declaration)과 정의(Definition)의 차이 (0) | 2022.06.21 |
[C++] Natural Sort 사용하기 (0) | 2022.06.14 |
[C++] Visual Studio <std::filesystem> 사용하기 (2) | 2022.06.11 |