공부목적으로 포인터와 래퍼런스 성능을 비교하는 코드를 만들어 본다.
결론적으로 성능차이는 무의미하며, 래퍼런스는 사용자에게 의도 표현 용도로 사용
대부분의 최적화된 C++코드에서는 포인터와 래퍼런스는 동일한 기계어로 떨어지기 때문에 성능차이는 거의 없다고 한다. 둘다 결국 주소를 통해 “주소를 통해 간접 접근”하는 모델이라, 컴파일러 / ABI관점에선 래퍼런스도 내부적으로 포인터로 관리되는 경우가 많다.
1. NULL가능성
래퍼런스는 언어 의미상 항상 유효한 객체를 참조하는것이 전제라, 컴파일러가 널 체크를 생략하거나 특정 최적화를 더 과감히 할 여지가 있다.
2. 별칭(aliassing) 최적화 힌트?
래퍼런스는 재지정 불가이기 때문에 사람과 컴파일러 모두에게 의도가 명확하다. 하지만 C++에서 래퍼런스가 포인터보다 별칭 분석에서 압도적으로 유리한건 아닌데, 서로 같은 메모리를 가리킬 수 있다는 점은 여전히 유효하기 때문에 큰 최적화 차이가 나지는 않는다.
3. 호출 규약 / 전달 방식
함수 인자로 T&를 받든 T*를 받든, 실제 호출 규약에서는 둘 다 레지스터/스택에 주소값 하나가 전달되는 형태가 흔하므로, 호출 오버헤드 자체는 대게 동일하다.
4. 디버그 빌드 / 최적화 옵션
디버그 빌드에서는 최적화가 약하기 때문에 우연한 차이가 보일 수 있지만, 이는 컴파일러가 최적화를 못한 결과인 경우가 많다.