2015년 9월 8일 화요일

Windows programming 공부하면서..(3)

32비트와 64비트 시스템에 차이는 한 번에 전송 및 수신할 수 있는 데이터의 크기에 따라 나뉘게 된다. 또한 데이터 처리 능력에도 차이가 있다.

'메모리가 크면 개발을 하는데 더 좋다'라는 말이 있는데 간단한 예문으로 이해해 보자.


TCHAR는 메크로 UNICODE의 정의 유무에 따라 1 byte 또는 2 byte로 받아 들인다. 1 byte라고 가정한다면 총 100byte가 필요한 상황이다. 활용 가능한 메모리가 40 byte라면 절대 프로그램을 실행할 수 없게 된다. 하지만 아래와 같이 코딩을 하면 실행이 가능하다.


위에 코드와 아래 코드에 차이를 이해 한다면 메모리 관리가 어떻게 되는지는 이해할 수 있을 것이다. 최적화가 되어 있는 예제는 ch에 계속해서 루프문을 돌면서 입력과 출력을 한 후 '\n'을 만나면 종료된다.(말을 어렵게 했나..? 이해가 안된다면 메모리 부분을 좀 더 공부하자!)


windows 같은 경우 LLP64 데이터 표현 모델을 따르며, 이는 32비트 시스템과의 호환성을 중시한 모델이다. UNIX와 차이는 long 타입에 표현에서 확인할 수 있다.


32bit와 64bit에 차이점



32bit에서는 아무런 문제가 되지 않는다.(int형크기 = pointer크기) 하지만, 64bit에서는 int형은 4byte인 반면 pointer는 8byte이기 때문에 손실이 생긴다.

windows 자료형 확인하기

알고 싶은 자료형에 단축 메뉴를 띄운 후 [Go To Definition, F12] 혹은 [Go To Declaration, Ctrl + F12]를 선택한다.


여기서 두개에 차이를 설명하면, 정의로 이동하느냐, 선언으로 이동하느냐에 차이이다. 선택하면 선언된 헤더파일로 이동하게 된다.

위와 같이 헤더파일 부분에 어떤식으로 정의되어 있는지 확인 할 수 있다. 이 방법 이외에 분석을 할 때 검색하 듯 MSDN을 참조하는 것도 좋다. MSDN에는 자세하게 설명이 되어 있기 때문에 더 유익할 수 있다.

Polymorphic 자료형

WIN64 기반으로 넘어오면 볼 수 있는 자료형이다. 단어에 뜻은 '다양한 모습이 있는' 혹은 '다형적'이라는 뜻으로 해석된다.

Polymorphic 자료형의 정의 형태



PTR이 붙어 있지만 포인터가 아닌 것을 확인 할 수 있다. 여기서 PTR을 붙인 이유는 포인터 값 기반의 산술연산을 위해 정의된 자료형이기 때문이다.


Polymorphic 예제


INT와 UINT는 각각 int, unsigned int와 동일하다.


위에 있는 프로그램은 순 WIN32기반에 프로그램이다. 이유는 전달 받는 인자나 반환값의 형태가 4 byte 기준으로 맞춰져 있기 때문이다.

곧, WIN64 기반에서는 4 byte로 표현 불가능한 범위의 주소값이 등장할 수 있으므로 위 함수는 WIN64 기반에서는 사용을 할 수 없다. WIN64 기반에서의 CalDistance 함수를 구현하면 아래와 같이 구현 가능하다.





_tmain() , main(), wmain() 간의 차이

_tmain()의 정의를 확인해 보면 아래와 같이 정의 되어 있다.


_tmain()은 유니코드 지원이 필요한 프로그램이면 wmain()으로 필요하지 않은 프로그램이면 main()으로 되는 것이다.

댓글 없음:

댓글 쓰기