为什么我需要它:尝试在Windows下构建malloc
实现。如果不可能,当给定NULL作为第一个参数时,我将不得不真正地返回VirtualAlloc()
返回的任何内容。虽然你会期望它做一些合理的事情,比如在可用的底部分配内存,但是没有任何保证。
答案 0 :(得分:2)
这可以通过使用VirtualQuery查找标记为免费的页面来实现。但这会相对缓慢。 (您还需要考虑与页面大小不同的分配粒度。)
我会说除非你需要连续的内存块,否则试图将所有内容保持在一起几乎是没有意义的,因为如果两个虚拟内存页可能在地址空间中彼此相邻,则没有理由认为它们是在物理记忆中彼此靠近。实际上,即使它们在某个时间点彼此接近,如果这些页面被移动到后备存储区然后再次出现在内存中,该页面也不会出现故障到同一个物理地址页面。
答案 1 :(得分:0)
操作系统使用更复杂的指标,而不仅仅是可用的“最低”内存地址。具体来说,VirtualAlloc
分配内存页面,因此根据您的要求,在起始地址必须至少有一页未使用的地址空间。因此,即使您认为应该使用的“较低”地址,该地址也可能与您要求的操作不兼容。