想象我正在做一个游戏

  • 我知道它将在64位系统和64位操作系统上运行
  • 游戏的内存预算是固定的 2(或4)千兆字节

  • 那是否意味着在该过程的Virtual Address Space的64位中,我可以剩下32位来玩呢?

    例如,我可以为游戏中的每个容器(容器=类似于std::vector)使用VirtualAllocMEM_RESERVE 2吉字节的内存吗?

    添加新元素后,将根据需要添加新的pages(大约64K)。容器死亡后,将相应地使用MEM_COMMIT释放内存。

    出于好奇:
  • 从技术上讲这可以工作吗?
  • 是否有任何性能原因不这样做?


  • 编辑:澄清:如果游戏中有10000个容器,那将保留2GiB * 10000个内存-但是提交的内存将小于2(或4)GiB。

    那些10000个容器也可以增加到2 ^ 16个容器(或地址空间允许的数目很多)。

    最佳答案

    是的,它可以正常工作。

    当我使用它1时,我发现将内存分配给它仍然是最好的方法,首先从相当大的内存块(例如,兆字节)开始,然后按照大小的几何级数递增。调用VirtualAlloc(显然)需要切换到内核模式,因此如果您有帮助的话,您有足够的开销避免经常执行此操作。


    1.虽然那是很早以前的事-Windows NT 4或Win2K时间框架,所以此后情况可能已经改变。

    07-26 09:35
    查看更多