[ 포인터 기초 ]

 

포인터는 

x86 운영체제에서는 4byte ( 32비트 ) 고정 크기를 사용 

 

x64 에서는  8byte (64비트) 고정 크기를 사용

 

 

그럼 

int* ptr;

 

처럼 왜 TYPE ( int 등등) 을 붙히는거지?

어짜피 4 or 8 byte 고정 크기인데?

 

얘는 포인터에 대한 추가 정보를 제공해준다.

 

주소를 건내받았을때 주소에 가면 뭐가 있는지가 중요한데 그 힌트를 주는것이다.

ex ) 결혼식 청첩장에 있는 주소 = 예식장 주소 가 있을것이다.

ex) 명함에 있는 주소 = 회사 주소 가 있을것이다

 

 

그럼 아래는 어떻게 될까?

__int64* ptr2 = (__int64*)&number; // number 은 int형 변수

해당 메모리에 데이터가 덮어 써지워진다.

 


[ 포인터 연산 ]

 

 포인터 + 1 은 정말 해당 포인터(주소값)을 +1 하라는 소리가 아니라 

 

32bit 주소 체계에서는 4바이트 만큼 이동하고 싶다는 소리이다. ( 포인트 타입 바구니 만큼 하나 증가 )

 

실제로 __int64 인 포인터에 +1 해주면 8byte 만큼 증가한다.

 

 

 

 

lea 인스트럭션을 통해 player 주소를 eax 레지스터에 옮겨주고

eax 레지스터를 다시 playerPtr에다가 넣어준다.

 

 

 

*playerPtr 은 Player 타입인데 클래스 변수인 hp와 damage가 각각 int 이니깐

애시당초 메모리에 클래스가 올라갈때 4byte 4byte 두 개가 올라가고 

 

그 값을 쓸때도 4byte 단위로 사용가능한것을 알 수 있다.

 

 

1000바이트 짜리 대형 구조체를 pass by value 로 넘기면 1000바이트가 복사되는데

pass by ref 로 넘기면  (32비트 체제 기준) 주소값인 4바이트를 넘겨 받게 되니깐 불필요한 복사가 필요가 없다.

 

 


[ 참조 기초 ]

 

사실 로우레벨 (어셈블리) 관점에서 실제 작동 방식은 포인터 작동 방식과 똑같음.

( Visual Studio 디어셈블리로 확인해보면 똑같다 )

 

그래서 사용할때는 값 전달 방식과 유사하게 사용되지만, 실제로는 주소 전달 방식으로 작동된다.

 

int& num = number;

 


[ 포인터 VS 참조 ]

 

  •  - 편의성이 있다는점은 좋으나 , 포인터는 주소를 넘기니 확실하게 원본을 넘긴다는 힌트를 줄 수 있는데,
  •  - 참조는 자연스럽게 모르고 지나칠 수도 있음. ( 그래서 ref 는 보통 const 랑 세트로 보면 된다. )
  •  - 포인터는 nullPtr 가 가능한데 ref 는 선언과 함께 초기화 해줘야 된다. ( 어찌보면 당연 별명을 지어줄라는데 원본이 없으면 안된다. - 장점일 수 도 있고 단점일 수 도 있다. )

const 위치에 주목!

 

함수 파라미터에 const 를 넣을때 위치에 따라 적용되는 상황이 다르다

 

 

 

 

 

 

 

결론은?

 

구글에서 만든 오픈소스를 보면 거의 무조건 포인터를 사용

언리얼 엔진에선 reference도 사용.

 

- 그래서 보통 없는 경우도 고려해야 한다면 포인터 사용. ( nullptr 체크 필수 )

- 바뀌지 않고 readonly 일 경우 cont ref& 사용.

- 그 외 일반적인 경우에는 ref를 사용하는걸 선호 ( 명시적으로 호출할 때 OUT을 붙힌다.)

C# 에서는 out 이라는 문법이 실제 존재하는데,

C++ 에서 OUT 은 그냥 개발자가 명시적으로 얘는 바뀔수도 있다고 표현만해주는거고

define OUT 해서 아무런 값도 없이 잡아준다.

컴파일러 입장에서는 그냥 OUT은 noting이다. 없어도 되고 있어도 되는 존재이다. 

그럼 이걸 함수로 넘겨줄때는

이런식으로 사용한다.

 

그러나 다른사람이 포인터로 만들어 놨을땐 , 이어서 포인터로 사용한다. ( 섞어서 사용하지는 않는다 )

 

 


[ 포인터 vs 배열 ]

 

중요!!

배열을 함수 인자로 넘기면 컴파일러가 알아서 포인터로 치환한다

+ Recent posts