윈도우즈 시스템 프로그래밍을 공부하면서 정리한 글입니다.
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바이트 정수형으로 형 변환 해서는 안됨
참고 : 뇌를 자극하는 윈도우즈 시스템 프로그래밍. 윤성우 저
댓글 없음:
댓글 쓰기