1

想象一下我在做一个游戏

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

这是否意味着在Virtual Address Space该过程的 64 位中,我会得到 32 位来随意玩?

例如,我可以为游戏中的每个容器(容器 = 类似的东西std::vector)使用2 GBVirtualAllocMEM_RESERVE内存吗?

添加新元素时,会根据需要编辑新元素pages(大约 64K)MEM_COMMIT。随着容器死亡,相应地释放内存VirtualFree

出于好奇:

  1. 这在技术上可行吗?

  2. 是否有任何性能原因不这样做?


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

这 10000 个容器也可以增加到 2^16 个容器(或者地址空间允许的任何数量)。

4

1 回答 1

1

是的,它可以工作。

当我玩弄它1时,我发现从相当大的内存块(例如,一兆字节)开始向它提交内存仍然效果最好,然后遵循大小的几何级数。调用VirtualAlloc(显然)需要切换到内核模式,因此如果可以提供帮助,您需要避免经常这样做的开销足够大。


1. 虽然那是很久以前的事了——Windows NT 4 或者可能是 Win2K 时间框架,所以从那以后事情可能已经改变了。

于 2016-12-01T03:03:07.577 回答