我有一个包含多个块的文件。我想映射文件,使不连续的块在内存中连续。
示例:
假定块大小为1kiB。
我知道我可以向MapViewOfFileEx
提供建议,以提供放置视图的位置。
我尝试使用VirtualAlloc
分配地址空间,然后将其作为基地址(X)传递,但出现错误487-“试图访问无效的地址。”
我如何保证地址空间中有足够大的区域,以便我知道这将起作用?
正如已经指出的,视图必须以内存分配粒度的倍数进行映射,因此1kiB块将无法按需工作。如果块大小与内存分配粒度相同,是否可以使示例工作?
答案 0 :(得分:1)
不能。这个想法行不通。有两个问题。首先,您传递给MapViewOfFileEx
的地址是一个请求。系统没有义务将您的文件映射到那里,如果地址不是免费的,则会失败。其次,您传递的地址必须是系统分配粒度的倍数。 (使用GetSystemInfo
函数检索此值。)您根本无法分配在我知道的任何体系结构上仅相距1 KiB的虚拟内存范围。
修改
如果您对此有所关注,那么我认为唯一(安全)的方法是使用间接层。创建一个新类,该类存储vector
个指向每个映射区域基地址的指针。类的operator[]
将根据索引确定正确的块,并计算其中所需元素的地址。 (基本上是std::deque
的工作方式。)