gpt4 book ai didi

winapi - VirtualAlloc 对齐与分配大小一致吗?

转载 作者:行者123 更新时间:2023-12-04 22:31:40 27 4
gpt4 key购买 nike

当使用 VirtualAlloc API 分配和提交具有 2 次幂页面边界大小的虚拟内存区域时,例如:

void* address = VirtualAlloc(0, 0x10000, MEM_COMMIT, PAGE_READWRITE); // Get 64KB
address 似乎总是以 64KB 对齐,而不仅仅是页面边界,在我的例子中是 4KB。

问题是:这种对齐是否可靠和规定,还是只是巧合? The docs 声明它保证在页面边界上,但没有解决我所看到的行为。我问是因为我稍后想获取一个任意指针(由使用此块的池分配器提供)并通过类似于以下内容的方法确定它属于哪个 64KB 块:
void* chunk = (void*)((uintptr_t)ptr & 0xFFFF0000);

最佳答案

VirtualAlloc 的文档描述了 2 个场景的行为:1) 保留内存和 2) 提交内存:

If the memory is being reserved, the specified address is rounded down to the nearest multiple of the allocation granularity.

If the memory is already reserved and is being committed, the address is rounded down to the next page boundary.


换句话说,内存以分配粒度的倍数分配(保留)并以页面大小的倍数提交。如果您在单个步骤中保留和提交内存,它将以分配粒度的倍数对齐。当提交已经保留的内存时,它将在页面边界处对齐。
要查询系统的页面大小和分配粒度,请调用 GetSystemInfo SYSTEM_INFO 结构的 dwPageSizedwAllocationGranularity 将分别保存页面大小和分配粒度。

关于winapi - VirtualAlloc 对齐与分配大小一致吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20023446/

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