>想象我正在制作一个游戏
- 我知道它将在64位系统上运行,在64位操作系统上运行。
- 游戏的内存预算是固定的2(或 4)千兆字节
这是否意味着在该过程的 64 位Virtual Address Space
中,我将剩下 32 位可以随心所欲地玩?
例如,我可以为游戏中的每个容器(容器=类似std::vector
)使用VirtualAlloc
并MEM_RESERVE
2 Gibibytes的内存吗?
随着新元素的添加,根据需要MEM_COMMIT
新的pages
(大约 64K)。当容器死亡时,内存会相应地释放VirtualFree
。
出于好奇:
-
这在技术上可行吗?
-
是否有任何性能原因不这样做?
编辑:澄清:如果游戏中有10000个容器,则将保留2GiB * 10000内存 - 但提交的内存将小于2(或4)GiB。
这 10000 个容器也可以增加到 2^16 个容器(或者地址空间允许的数量)。
是的,它可以工作。
当我玩过它1时,我发现它仍然最好从相当大的内存块(例如,兆字节)开始将内存提交到它,然后遵循大小的几何级数。调用VirtualAlloc
(显然)需要切换到内核模式,因此如果可以提供帮助,您希望避免经常这样做,这有足够的开销。
1.虽然那是很久以前的事了 - Windows NT 4或Win2K的时间框架,所以事情可能已经发生了变化。