Win32内存映射文件,在相邻位置具有视图

时间:2018-09-12 03:20:38

标签: c++ c c++11 winapi visual-c++

我有一个包含多个块的文件。我想映射文件,使不连续的块在内存中连续。

示例:

假定块大小为1kiB。

  • 块1:文件中的偏移量0,映射到位置X
  • 块2:文件偏移1kiB,映射到位置X + 2kiB
  • 块3:文件偏移2kiB,映射到位置X + 1kiB

我知道我可以向MapViewOfFileEx提供建议,以提供放置视图的位置。

我尝试使用VirtualAlloc分配地址空间,然后将其作为基地址(X)传递,但出现错误487-“试图访问无效的地址。”

我如何保证地址空间中有足够大的区域,以便我知道这将起作用?


正如已经指出的,视图必须以内存分配粒度的倍数进行映射,因此1kiB块将无法按需工作。如果块大小与内存分配粒度相同,是否可以使示例工作?

1 个答案:

答案 0 :(得分:1)

不能。这个想法行不通。有两个问题。首先,您传递给MapViewOfFileEx的地址是一个请求。系统没有义务将您的文件映射到那里,如果地址不是免费的,则会失败。其次,您传递的地址必须是系统分配粒度的倍数。 (使用GetSystemInfo函数检索此值。)您根本无法分配在我知道的任何体系结构上仅相距1 KiB的虚拟内存范围。

修改

如果您对此有所关注,那么我认为唯一(安全)的方法是使用间接层。创建一个新类,该类存储vector个指向每个映射区域基地址的指针。类的operator[]将根据索引确定正确的块,并计算其中所需元素的地址。 (基本上是std::deque的工作方式。)