성능 : 똑같음!
포인터는 호출부에서 주소를 넘긴다는 힌트를 줄 수 있는데, 참조는 그렇지 못해서 좀 더 실수하기 쉽다.
const StatInfo& info
원본 수정으로 인한 실수를 막고자 const를 붙인다.
const StatInfo* const info
뒤의 const는 주소값 수정을 막는 것이고, 앞의 const는 주소가 가리키는 공간의 수정을 막는 것이다.
참조 타입은 정의와 동시에 초기화되어야 하며, 포인터 산술 연산이 불가능하다.
포인터 타입은 유효하지 않은 주소를 가리킬 수도 있고, 산술 연산이 가능하다.
포인터로 어떠한 주소도 가리키고 있지 않다는 상태를 나타내려면, 0, NULL, nullptr을 사용하는 방법이 있다. NULL은 0으로 define되어 있으며, 정수형 타입에도 대입할 수 있다. 좀 더 진화된 방식인 nullptr은 정수형으로 사용하지 못하게 컴파일 에러를 발생시켜 준다.
유효하지 않은 주소(nullptr)을 가리킬 수 있다면, 유효한 경우와 그렇지 않은 경우를 구분지을 수 있는 장점이 있지만, 유효하지 않은 주소에 접근하는 실수를 유발할 수 있다.
Team by Team
ex) 구글에서 만든 오픈소스를 보면 거의 무조건 포인터 사용
ex) 언리얼 엔진에선 reference도 애용
선호 스타일)
#define OUT
void ChangeInfo(OUT StatInfo& info)
{
...
}
...
ChangeInfo(OUT info);
pointer = &reference;
mov eax,dword ptr [reference]
mov dword ptr [pointer],eax
pointer = pointer2;
mov eax,dword ptr [pointer2]
mov dword ptr [pointer],eax
int& referene2 = *pointer;
mov eax,dword ptr [pointer]
mov dword ptr [reference2],eax
int& reference3 = reference;
mov eax, dword ptr [reference]
mov dword ptr [reference3],eax