2008년 03월 06일
HeapAlloc , LocalAlloc, GlobalAlloc
기능 : 힙에서 메모리 블록을 할당.
LPVOID HeapAlloc(HANDLE hHeap, DWORD dwFlags, DWORD dwBytes);
HLOCAL LocalAlloc(UINT uFlags, UINT uBytes);
HGLOBAL GlobalAlloc(UINT uFlags, DWORD dwBytes);
[LocalAlloc 과 HeapAlloc]
- Win16 환경
16비트 윈도우 환경에서는 LocalAlloc과 GlobalAlloc 함수는 완전히 다른다.
LocalAlloc는 near pointer를 반환하고 GlobalAlloc는 far pointer를 반환한다.
LPVOID HeapAlloc(HANDLE hHeap, DWORD dwFlags, DWORD dwBytes);
HLOCAL LocalAlloc(UINT uFlags, UINT uBytes);
HGLOBAL GlobalAlloc(UINT uFlags, DWORD dwBytes);
[LocalAlloc 과 HeapAlloc]
- Win16 환경
16비트 윈도우 환경에서는 LocalAlloc과 GlobalAlloc 함수는 완전히 다른다.
LocalAlloc는 near pointer를 반환하고 GlobalAlloc는 far pointer를 반환한다.
GlobalAlloc은 전역, 즉 윈도우가 사용하는 Global Heap영역을 사용하고,
LoaclAlloc은 Local Heap을 사용한다.
- Win32 환경
32비트 윈도우 환경에서는 LocalAlloc과 GlobalAlloc 함수는 완전히 동일하다.
기능은 완전히 동일하나 하위 호환성을 위해 각각의 함수가 존재한다.
[HeapAlloc과 LocalAlloc/GlobalAlloc 의 차이점]
- 메모리 블록을 할당하는 힙이 다르다.
* LocalAlloc은 항상 디폴트 힙(어플리케이션이 하나씩 가지는 메인 힙)에서 할당한다.
디폴트 힙은 프로세스가 생성되고 가상 주소 공간이 생겨날 때 같이 생성되는 힙이다.
그 크기는 링크시 실행파일 헤더에 기록이 된다. 링크 옵션으로 그 크기를 변경할 수도 있다. 기본 값은 1MB이다.
* HeapAlloc은 임의의 힙에서 할당한다.
HeapCreate로 만든 힙일 수도 있고 GetProcessHeap으로 얻는 디폴트 힙일 수도 있다.
- HeapAlloc은 포인터를 리턴하지만 LocalAlloc은 핸들을 리턴한다.
* LocalAlloc으로 할당받은 메모리 블록을 실제로 사용할 때는 LocalLock 함수로 포인터를 얻어와야 한다.
LocalAlloc의 사용이 좀 더 불편하지만 핸들을 사용하므로써 동기화와 같은 기능을 제공한다.
그리고 포인터를 직접 사용하지 않고 포인터를 사용하는 또 다른 (결과적으로) 이유는 다음과 같다.
LocalAlloc의 첫번째 인자는 할당받을 메모리 블록의 특성을 지정하는데, GMEM_MOVEABLE 이라는 특성을 지정할 수 있다.
이는 힙 메모리 단편화 제거를 위해 또는 힙 공간이 부족할 때 힙 관리자가 메모리 블록을 이동할 수 있도록 하게 하는데
이렇게 되면 포인터로 리턴했을 경우 이동된 후 잘못된 참조를 하게 되므로 핸들로서 관리되는 것이다.
실제로 GMEM_MOVEABLE 이 아닌 GMEM_FIXED로 지정하게 되면 리턴값은 그 자체가 포인터이다.
- Win32 환경
32비트 윈도우 환경에서는 LocalAlloc과 GlobalAlloc 함수는 완전히 동일하다.
기능은 완전히 동일하나 하위 호환성을 위해 각각의 함수가 존재한다.
[HeapAlloc과 LocalAlloc/GlobalAlloc 의 차이점]
- 메모리 블록을 할당하는 힙이 다르다.
* LocalAlloc은 항상 디폴트 힙(어플리케이션이 하나씩 가지는 메인 힙)에서 할당한다.
디폴트 힙은 프로세스가 생성되고 가상 주소 공간이 생겨날 때 같이 생성되는 힙이다.
그 크기는 링크시 실행파일 헤더에 기록이 된다. 링크 옵션으로 그 크기를 변경할 수도 있다. 기본 값은 1MB이다.
* HeapAlloc은 임의의 힙에서 할당한다.
HeapCreate로 만든 힙일 수도 있고 GetProcessHeap으로 얻는 디폴트 힙일 수도 있다.
- HeapAlloc은 포인터를 리턴하지만 LocalAlloc은 핸들을 리턴한다.
* LocalAlloc으로 할당받은 메모리 블록을 실제로 사용할 때는 LocalLock 함수로 포인터를 얻어와야 한다.
LocalAlloc의 사용이 좀 더 불편하지만 핸들을 사용하므로써 동기화와 같은 기능을 제공한다.
그리고 포인터를 직접 사용하지 않고 포인터를 사용하는 또 다른 (결과적으로) 이유는 다음과 같다.
LocalAlloc의 첫번째 인자는 할당받을 메모리 블록의 특성을 지정하는데, GMEM_MOVEABLE 이라는 특성을 지정할 수 있다.
이는 힙 메모리 단편화 제거를 위해 또는 힙 공간이 부족할 때 힙 관리자가 메모리 블록을 이동할 수 있도록 하게 하는데
이렇게 되면 포인터로 리턴했을 경우 이동된 후 잘못된 참조를 하게 되므로 핸들로서 관리되는 것이다.
실제로 GMEM_MOVEABLE 이 아닌 GMEM_FIXED로 지정하게 되면 리턴값은 그 자체가 포인터이다.
[VirtualAlloc과 GlobalAlloc, LocalAlloc의 차이점]
- VirutalAlloc은 64bit 메모리 주소를 리턴한다.
- GlobalAlloc, LocalAlloc은 32bit 메모리 주소를 리턴한다.
- VirtualAlloc은 메모리를 설정한것을 다른 곳에서 공유할 수 있으나, Global, Locak에서는 한 곳에서만 독점하여 사용한다.
[Virtual Memory 사용 방법]
- VirtualAlloc(페이지를 생성한다.) -> VirtualLock(페이지를 예약한다.) -> 데이터를 페이지에 기록한다. -> 데이터를 사용한다. -> VirtualUnLock(페이지 예약을 취소한다.) -> VirtualFree(페이지를 삭제한다.)
# by | 2008/03/06 13:49 | Windows Programing | 트랙백 | 덧글(1)





☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]