c++ - Windows Mobile 上的连续 VirtualAlloc 行为

标签 c++ windows-mobile memory-management windows-ce virtualalloc

我一直在优化 Windows Mobile 应用程序上的内存性能,并且遇到了 VirtualAlloc on Win32 之间的一些行为差异。和 Windows CE

考虑以下测试:

// 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 文档中找不到任何提及,无论这是合法的还是巧合,但我通过谷歌找到了许多期望这种行为的代码示例。

在 Windows CE 5.0/5.2 上,如果我使用“c”处的内存块,99% 的情况下都没有问题,但是在某些(不是全部)Windows Mobile 6 设备上,ReadFile & 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

最佳答案

不,这是不可能的。

关于c++ - Windows Mobile 上的连续 VirtualAlloc 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/874824/

相关文章:

c++ - 异常(exception):错误的输出

c# - Uninstall_Init/Uninstall_Exit 我如何在 C# 中访问它们

c - *** 检测到 glibc *** : free(): invalid next size (fast) in C code

使用指针的 C++ 类型转换

c++ - segmentation 后如何查看生成的边?

java - 使用 SWIG 在 Java 和 C++ 之间传递缓冲区

c++ - 检查是否连接了打印机

c# - Compact Framework - 是否有可用的 MVC 框架/库?

c++ - 指向连续内存的指针

c++ - 每个进程允许的最大堆使用量