gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 00:49:43 25 4
gpt4 key购买 nike

我一直在优化 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 文档中找不到任何提及它是否合法或巧合,但我通过 google 找到了很多代码示例,这些示例预计会出现这种行为。

在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com