/*

 * http://sosal.kr/

 * made by so_Sal

 */




64bit와 32bit의 구분?

1. 한번에 송수신 가능한 데이터 크기 (I/O bus)
2. 데이터 처리능력 (cpu가 전체적으로 한번에 읽을 수 있는 크기)

두가지 모두 64bit 여야 64bit라고 할 수 있겠습니당.
(두개가 일치하지 않을 시 오류 발생 가능성이 높아짐..)

32bit = 4byte. 우리가 흔히 알고있는 포인터 자료형의 크기.
64bit = 8byte. 64비트 컴퓨터에서 사용하는 포인터 자료형의 크기입니다.

pointer의 크기가 크면 클수록 접근할 수 있는 메모리의 영역이 넓어집니다.
하지만 I/O bus가 한번에 전송할 수 있는 메모리 크기 이상이 된다면
I/O bus가 2번을 전송해야 하나의 명령어가 갖춰지기 때문에
성능저하를 초래하게 됩니다.
따라서 pointer의 크기가 크긴 크되, I/O bus가 한번에 전송할 수 있는 메모리 크기와
같을때가 가장 이상적인 크기가 되겠습니다.

32bit 주소체계에서는 2^32 = 4G 가 최대로 나타낼 수 있는 메모리 영역입니다.
64bit 주소체계에서는 2^64 = 4G * 4G 어마어마하게 큰 수.
만약 사용자의 메인 메모리가 4G 이하면 64bit 체계의 운영이 필요없지 않느냐?
라는 의문이 있을 수 있는데, 이것은 가상메모리 라는것을 이용하여 해결하게 됩니다.

pointer의 크기는 클 수록 좋다.
I/O bus 의 크기보다 크다면, 쪼개서 보내야 하기 때문에
64bit 컴퓨터에서는 포인터의 크기가 64bit인게 가장 좋고,
32bit 컴퓨터에서는 포인터의 크기가 32bit인게 가장 좋습니다.


프로그래밍 할때, 변수 2개의 거리가 얼마나 차이나는지
확인을 해야할 때가 가끔 있습니다. 이경우에
포인터를 이용하여 주소값을 가져오는데, (흔히 포인터의 주소값을 int형으로 저장)
64비트에서는 포인터는 8byte. 32비트에서는 포인터는 4byte.
각각의 크기가 달라서, 메모리의 주소를 가져올때 메모리의 손실로 인해
정확한 계산이 불가능 할 때가 있습니다.

이때 포인터가 가리키는 주소값을 저장하기 위해서
여러가지 변수가 있습니다.
#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_PTR;
     typedef unsigned long ULONG_PTR;
     typedef int INT_PTR;
     typedef unsigned int UINT_PTR;
#endif

여기서 변수이름들 끝에 PTR이 있는데, 이 PTR은 포인터라는
의미가 아닙니다. (typedef 선언만 보더라도 *가 아닌것을 알 수 있습니다.)
#define _WIN64를 통해 운영체제를 확인하여,
운영체제에 따른 pointer크기의 호환성을 맞춰주기 위해 있는 변수들입니다.

__int64 변수는 64bit signed integer 값.
즉 –9223372036854775808 ~ 9223372036854775807
범위를 가집니다.

참고도서 : 윈도우즈 시스템 프로그래밍 | 윤성우 저 | 한빛미디어
Posted by sosal sosal

댓글을 달아 주세요