INT_PTR, __int64




  책에 있는 소스 코드를 보다가 INT_PTR 이라는 데이터 타입을 보게 되었다.
MSDN 의 Windows Data Type 을 찾아 보면 다음과 같이 나온다.



 포인터의 정밀성을 위한 부호있는 정수형 타입(Signed integer type) 이다.
포인터 연산을 수행하기 위한 정수형 타입으로의 캐시팅시 사용된다.
이 타입은 BaseTsd.h 에 정의 되어 있다.


 정의된 선언을 보면 _WIN64 플래그가 선언되어 있으면(64비트 환경에서) INT_PTR 은 __int64 형과 같다.
_WIN64 가 아닌 환경 (32비트 환경) 에서는 int 형과 같다.




1. 그렇다면 64비트 환경과 32비트 환경에서 포인터의 정밀도에 차이가 있는 것일까?

  지금까지의 환경, 즉 32비트 환경에서 프로그래밍을 할 때 포인터의 크기는 4Byte 라고 공식처럼
알고 있다. 따라서 포인터 값을 4Byte 변수에 저장 하여도 아무 문제가 없다.
#class MyClass* pMyPointer;
DWORD dwValue = (DWORD) pMyPointer;


하지만 64비트 환경에서 위와 같은 코드는 문제를 일으킬 수 있다.
DWORD 값은 32비트 크기의 변수지만 pMyPointter 포인터 값은 64비트 값을 갖기 때문이다.
강제 캐스팅 이니까 포인터 값의 값이 잘릴테고 dwValue 는 엄한 곳을 가리키기 때문에
잘못된 메모리 영력 침범으로 프로세스가 종료될 것이다.


그래서 등장한 것이 INT_PTR

class MyClass* pMyPointer;
INT_PTR dwValue = (INT_PTR) pMyPointer;

 32비트, 64비트 환경에 관계없이 dwValue 변수에는 pMyPointer 포인터 값을 저장할 수 있다.

 결국 INT_PTR 의 사용 목적은 int 형의 포인터 값을 32비트와 64비트에서 그 값이 달라질 수 있을때
INT_PTR로 호환성을 맞쳐주는데 목적이 있다고 생각이 된다.


※ 근데 포인터 값을 굳이 다른 정수형 타입으로 저장해야 하는 경우가 있을까?
   아직 겪어보지 못했는데...




2. 32비트 환경에선 포인터 값의 크기는 항상 4Byte??
  포인터의 크기는 컴파일러 정책에 따라 달라질 수 있다. 즉 항상 4Byte 값을 나타내지는 않는다.
cf) http://kldp.org/node/39915?page=1
  32비트 환경에서 CPU는 데이터 처리의 단위가 4Byte 일 때 가장 좋은 성능을 가지므로
그렇게 정한 것이라고 생각 된다.




3. __int64??
  부끄럽게도 __int64 라는 데이터 타입을 대학교때는 한번도 보질 못했다 -_-;;;
64bit signed integer 값을 가지며 값의 표현 범위는 –9223372036854775808 ~ 9223372036854775807 이다.

Posted by six605
,