저는 Windows Mobile 응용 프로그램에서 메모리 성능을 최적화했으며 VirtualAllocon Win32 및 Windows CE 사이의 동작 차이를 경험했습니다.Windows Mobile에서의 연속적인 VirtualAlloc 동작
// Allocate 64k of memory
BYTE *a = (BYTE*)VirtualAlloc(0, 65536,
MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);
// Allocate a second contiguous 64k of memory
BYTE *b = (BYTE*)VirtualAlloc(a+65536, 65536,
MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);
BYTE *c = a + 65528; // Set a pointer near the end of the first allocation
BOOL valid1 = !IsBadWritePtr(c, 8); // Expect TRUE
BOOL valid2 = !IsBadWritePtr(c+8, 4088); // Expect TRUE
BOOL valid3 = !IsBadWritePtr(c, 4096); // TRUE on Win32, FALSE on WinCE
코드는 "C"에서 시작하는 데이터의 4096 "할당"
는 다음의 시험을 고려하십시오. Win32에서는 이것이 작동합니다. VirtualAlloc 문서에 합법적인지 또는 우연인지는 알 수 없지만이 동작을 예상하는 Google을 통해 발견 한 코드의 예가 많이 있습니다.
윈도우 CE에5.0/5.2 내가 아무런 문제 그러나 일부 (모든) 윈도우 모바일 6 개 기기에 에서 ReadFile이없는 경우 99 %에서, "C"에서 메모리 블록을 사용하는 경우 & 의 WriteFile 오류 87 (매개 변수가 잘못되었습니다.)과 함께 실패합니다. 나는 ReadFile이 IsBadWritePtr 또는 그와 비슷한 것을 호출하고 false를 반환한다고 가정한다. 두 개의 ReadFile을 호출하면 모든 것이 잘 동작합니다. 물론 다른 API 호출이 실패 할 수도 있습니다.
위의 작업을 수행 할 수 있도록 VirtualAlloc에 의해 반환 된 메모리를 확장하는 방법을 찾고 있습니다. Windows CE에서 많은 양의 메모리를 확보하는 것은 각 프로세스가 32MB 만 나오고 다른 항목이로드되어 다른 문제를 일으키지 않고 많은 메모리 영역을 예약 할 수 없으므로 문제가됩니다. 공유 영역에 더 많은 양의 메모리를 예약 할 수는 있지만 다른 문제가 있습니다. VirtualAlloc은 미리 예약하지 않고 영역을 확대하거나 결합 할 수 있습니까?
는 나는 다음 예제 주어진 문제가 될 수 있습니다 의심 :
HANDLE hHeap1 = HeapCreate(0, 0, 0); // Heap defaults to 192k
BYTE * a1 = (BYTE*)HeapAlloc(hHeap1, 0, 64000); // +96 bytes from start of heap
BYTE * b1 = (BYTE*)HeapAlloc(hHeap1, 0, 64000); // +16 bytes from end of a1
BYTE * c1 = (BYTE*)HeapAlloc(hHeap1, 0, 64000); // +16 bytes from end of b1
BYTE * d1 = (BYTE*)HeapAlloc(hHeap1, 0, 64000); // +4528 bytes from end of c1
HANDLE hHeap2 = HeapCreate(0, 4*1024*1024, 4*1024*1024); // 4MB Heap
BYTE * a2 = (BYTE*)HeapAlloc(hHeap2, 0, 64000); // +96 bytes from start of heap
BYTE * b2 = (BYTE*)HeapAlloc(hHeap2, 0, 64000); // +16 bytes from end of a2
BYTE * c2 = (BYTE*)HeapAlloc(hHeap2, 0, 64000); // +16 bytes from end of b2
BYTE * d2 = (BYTE*)HeapAlloc(hHeap2, 0, 64000); // +16 bytes from end of c2
답변을 수락했습니다 :-). 내 코드를 사용법 등을 기반으로 로컬 및 공유 메모리 영역에서 메모리 관리를 분할하는 곳에서 그대로 두어야합니다. 여전히 작동하지만 더 많은 코드 및 관리를 추가해야합니다. 감사합니다. – Steven
흠, 그렇습니다. 더 나은 방법이없는 것은 수치 스럽습니다. 내가 가지고있는 다른 생각은 현재 해결 방법보다 더 복잡해질 것이라고 확신합니다. 누군가가 우리를 잘못 증명하는 것은 좋을 것입니다. –