LISTORY

[윈도우즈 시스템 프로그래밍]프로그램 구현 관점에서의 WIN32 vs WIN64 본문

IT/윈도우 프로그래밍

[윈도우즈 시스템 프로그래밍]프로그램 구현 관점에서의 WIN32 vs WIN64

LiStoryTeller 2018. 5. 18. 00:46


뇌를 자극하는 윈도우즈 시스템 프로그래밍 책 관련 유투브 강의 정리이다. 이번에는 프로그램 구현 관점에서의 WIN32 vs WIN64 부분에 대하여 정리하겠다.


 ⊙ YouTube 주소 ⊙ ☞프로그램 구현 관점에서의 WIN32 vs WIN64


프로그램 구현 관점에서의 WIN32 vs WIN64


⊙ 64비트 기반 프로그래밍


- 64비트 시스템을 고려한 프로그래밍

-자료형에 대하여 고려해야 한다.

- Windows는 LLP64 모델을 채택하고 있다.


사실, 자료형에서 WIN32에 비해 WIN64의 차이가 있는 것은 포인터가 8바이트로 처리된다는 것 뿐이다. 이는 호환성을 위해서이다.


그럼 64비트와 32비트가 공존할 때 생길 수 있는 문제는 무엇이 있을까?


예제 코드를 보겠다.


#include <stdio.h>

int main(void)

{

int arr[] = {0, };

int arrVal = (int)arr; // 데이터 손실이 발생할 수 있는 위치

...

return 0;

}


위의 예제 코드에서 arr 배열의 이름은 사실상 포인터이므로 8바이트로 처리가 된다.


이 배열을 int로 강제 형변환을 하는 코드를 볼 수 있다.


32비트에서는 int와 배열의 이름 모두 4바이트로 처리가 되므로 문제가 되지 않는다.


하지만 64비트에서는 8바이트로 주소값을 표현하다가 4바이트로 처리를 하게 되면 데이터 손실이 발생할 수 있다.


64비트에서는 절대 기본자료형으로 포인터를 캐스팅해서는 안된다.



⊙ Polymorphic 자료형


하나가 둘 이상의 특징을 가질 때 다형성을 지닌다고 한다. Polymorphic 자료형은 다형성을 지니는 자료형이다.

 

대표적인 Polymorphic 자료형


#if defined(_WIN64)

typedef __int64 LONG_PTR;

typedef unsigned __int64 ULONG_PTR;

typedef __int64 INT_PTR;

typedef unsigned __int64 UINT_PTR;

#else

typedef long LONG_PRT;

typedef unsigned ULONG_PTR;

typedef int INT_PTR;

typedef unsigned int UINT_PTR;

#endif


_WIN64 는 64비트 기반으로 프로그래밍 하겠다는 선언이다.


_WIN64가 선언되어 있다면, UINT_PTR은 unsigned __int64가 되고 그렇지 않다면 unsinged int 형이 될 것이다(다형성).




⊙ 오류의 확인


오류이 발생했다면 그 오류와 오류의 원인을 알아내야 한다.


오류를 알기 위해서 전역적으로 선언된 메모리 공간에 오류의 이유를 저장해둔다.


오류가 발생했을때마다 이 공간에 오류의 이유를 등록하기때문에 오류가 발생하면 전역공간에 있는 오류를 가져가 해석해야 한다.


이 전역공간에 접근을 도와주는 함수가 GetLastError() 함수이다. 이 함수에서 전달받은 값을 통해 오류를 알 수 있다.




Comments