gpt4 book ai didi

c++ - 具有相邻位置 View 的 Win32 内存映射文件

转载 作者:太空宇宙 更新时间:2023-11-04 03:15:35 26 4
gpt4 key购买 nike

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

例子:

假设 block 大小为 1kiB。

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

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

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

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


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

最佳答案

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

编辑

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

关于c++ - 具有相邻位置 View 的 Win32 内存映射文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52287016/

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