2012년 8월 23일 목요일

윈도우즈 시스템 프로그래밍 [3] - 64기반 프로그래밍



윈도우즈 시스템 프로그래밍을 공부하면서 정리한 글입니다.



3장. 64비트 기반 프로그래밍



I. WIN 32 VS WIN 64



1. 64비트와 32비트


- I/O 버스를 통해 전송 및 수실할 수 있는 데이터 크기에 따라 분류
- 한번에 송, 수신할 수 있는 데이터 크기와 한번에 처리할 수 있는 데이터 크기를 기준으로
   32비트 컴퓨터와 64비트 컴퓨터를 구분 짓는다.

2. 프로그래머 입장에서의 64비트 컴퓨터


- 표현할 수 있는 주소값의 범위가 넓으면 넓을수록 좋음
- 32비트 컴퓨터 -> 주소 범위와 연산 속도를 고려했을때 32비트 주소 표현이 최선
   ( 주소값 이동 & 연산이 한번에 처리됨, 32비트 컴퓨터는 표현할 수 있는 범위가 4GB나 됨 )

ex)

int arr[5] = {1, 2, 3, 4, 5,};
int *pArr = arr;
pArr += 1;

=> 주소가 32비트라면 ALU에 전송 후 연산이 한번에 가능
=> 주소가 64비트라면 ALU에 두번 나눠 전송 후 최소 두번의 연산이 필요 -> 속도 저하

- 메인 메모리인 RAM에는 주소가 붙어 있지 않음
   -> 운영체제에서 프로그램 실해응ㄹ 위해 편의상 붙여놓은 가상 메모리 주소를 사용


II. 프로그래머 관점에서의 WIN32 VS WIN64



1. LP64 VS LL64


- 32비트 -> int, long, 포인터 모두 4바이트로 표현
- 64비트

Windows
   LL64모델, char : 1바이트, short : 2바이트, int : 4바이트, long : 4바이트, 포인터 : 8바이트

UNIX
   LP64모델, char : 1바이트, short : 2바이트, int : 4바이트, long : 8바이트, 포인터 : 8바이트

2. 64비트와 32비트 공존의 문제


ex)

int main {

int arr[10] = { 0, };
int arrVal = (int) arr;   // 64비트에서 포인터를 int, long 등 4바이트 자료형으로 변환해선 안됨
printf ( "%d \n", arrVal );

return 0;
}

=> 64비트 시스템에서는 포인터가 가지고 있는 주소값을 4바이트 정수형으로 형 변환 해서는 안됨





참고 : 뇌를 자극하는 윈도우즈 시스템 프로그래밍. 윤성우 저



댓글 없음:

댓글 쓰기