포인터 vs 참조

namu·2022년 7월 6일

성능 : 똑같음!

포인터는 호출부에서 주소를 넘긴다는 힌트를 줄 수 있는데, 참조는 그렇지 못해서 좀 더 실수하기 쉽다.

const StatInfo& info
원본 수정으로 인한 실수를 막고자 const를 붙인다.

const StatInfo* const info
뒤의 const는 주소값 수정을 막는 것이고, 앞의 const는 주소가 가리키는 공간의 수정을 막는 것이다.

참조 타입은 정의와 동시에 초기화되어야 하며, 포인터 산술 연산이 불가능하다.
포인터 타입은 유효하지 않은 주소를 가리킬 수도 있고, 산술 연산이 가능하다.

포인터로 어떠한 주소도 가리키고 있지 않다는 상태를 나타내려면, 0, NULL, nullptr을 사용하는 방법이 있다. NULL은 0으로 define되어 있으며, 정수형 타입에도 대입할 수 있다. 좀 더 진화된 방식인 nullptr은 정수형으로 사용하지 못하게 컴파일 에러를 발생시켜 준다.

유효하지 않은 주소(nullptr)을 가리킬 수 있다면, 유효한 경우와 그렇지 않은 경우를 구분지을 수 있는 장점이 있지만, 유효하지 않은 주소에 접근하는 실수를 유발할 수 있다.

Team by Team
ex) 구글에서 만든 오픈소스를 보면 거의 무조건 포인터 사용
ex) 언리얼 엔진에선 reference도 애용

선호 스타일)

  • 없는 경우도 고려해야 한다면 pointer (null 체크 필수)
  • readonly인 경우 const ref&
  • 그 외 일반적으로 ref (가독성을 위해 인자와 매개변수에 OUT을 붙임)
  • 단, 다른 사람이 만들어 놓은 걸 이어서 만든다면, 방법을 계속 유지
#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
profile
안녕하세요

0개의 댓글