http://bravedog.blog.me/100005576789
프로그램 개발환경이 WIN32로 바뀌면서 의미를 잃어버린 포인터들이 있다. 이것이 near 및 far포인터이다. 하지만 예전의 소스를 해석하다 보면 심심찮게 볼 수 있다. 예전의 16비트 OS들은 메모리를 세그먼트(16bit):옵셋(16bit)의 형태로 다루었다. 옵셋을 사용하여 접근할 수 있는 메모리 공간은 64KB가 되고 세그먼트와 옵셋을 모두 사용할 경우 접근할 수 있는 메모리 공간은 총 1MB가 된다.
터보 C에서는 디폴트로 스몰모델(small model)의 컴파일을 사용한다. 이것은 옵셋만의 변화로 메모리에 접근하는 방식으로써 앞서 말한 바와 같이 64KB의 메모리 공간에 할당이 된다. 하지만 필요에 따라서 더 많은 메모리가 필요할 경우 터보 C에서는 near와 far키워드를 사용하여 접근할 수 있다.
near 포인터는 64KB용, far 포인터는 1MB용으로 스몰모델에서는 데이터의 기본형을 모두 near형으로 가정하기 때문에 near는 쓰지 않아도 된다.
int far *fp; // fp는 1MB 메모리 영역용 far 포인터
int near *np; // np는 64KB 메모리 영역용 near 포인터
단, far 형 포인터에 메모리번지를 대입할 때는 long형 정수를 사용해야 한다. long형 정수(4바이트)중 앞의 2바이트는 세그먼트를, 뒤쪽의 2바이트는 옵셋을 나타낸다.
np=0x1234; // np 옵셋(0x1234)
fp=0x20001234L; // fp는 세그먼트(0x2000):옵셋(0x1234)
뒤에 설명할 동적 메모리에 관한 함수들은 모두 far 포인터 형 함수를 별도로 가지고 있다. far 포인터 형 함수는 unix와 ansi c에서는 제공이 되지 않고 도스와 윈도우에서만 사용하였지만 최근에는 WIN32로 환경이 바뀌면서 사용하지 않게 되었다. 좀더 상세히 말하면 near포인터와 far포인터는 windef.h파일에 정의되는데 win32로 바뀌면서 빈 문장열로 처리하도록 변경되었다.
참고로 기존의 16비트 OS환경에서의 메모리 관련 far 포인터 형 함수의 원형들은 다음과 같다.
near 형 | far 형 |
malloc | void far *farmalloc(unsigned long nbytes); |
calloc | void far *farcalloc(unsigned long nunits, unsigned long nunitz); |
realloc | void far *farrealloc(void far *oldblock, unsigned long nbytes); |
free | void far *farfree(void far *block); |
memset | void far *far_fmemset(void far *s, int c, size_t n); |
http://goo.gl/PJqZm
far 포인터(far *)인 경우에는 L로 시작합니다 - LPVOID
'프로그래밍(Programming) > c++, 11, 14 , 17, 20' 카테고리의 다른 글
HRESULT와 LRESULT , [요약] HRESULT 값의 의미 (0) | 2012.12.27 |
---|---|
[Effective C++] Inline Function (0) | 2012.12.26 |
printf 서식 %d %u %f %c 등등.. (0) | 2012.11.18 |
C++ 네임스페이스의 간소화 (0) | 2012.11.08 |
new, delete 연산자 오버로딩 (0) | 2012.11.04 |