【发布时间】:2023-03-06 09:06:01
【问题描述】:
想象一下我正在制作一个游戏
- 我知道它将在 64 位系统、64 位操作系统上运行
- 游戏的内存预算是固定的2(或4)Gibibytes
这是否意味着在该进程的 64 位 Virtual Address Space 中,我可以随意使用 32 位?
我可以 - 例如 - 对于游戏中的每个容器(容器 = 类似于 std::vector)使用 VirtualAlloc 和 MEM_RESERVE 2 Gibibytes 内存吗?
随着新元素的添加,新的pages(大约 64K)会根据需要进行MEM_COMMITed。随着容器死亡,内存被相应地释放为VirtualFree。
出于好奇:
这技术上会起作用吗?
是否有任何性能原因不这样做?
编辑:澄清:如果游戏中有 10000 个容器,则 保留 2GiB * 10000 内存 - 但 提交 内存将小于 2(或 4)吉布。
这 10000 个容器也可以增加到 2^16 个容器(或者地址空间允许的任何数量)。
【问题讨论】:
-
在否决或投票结束之前/之后发表评论将不胜感激。谢谢。
-
IIRC 当前处理器只为您提供 48 位地址空间(前 16 位必须为 0,如果您处于内核模式但不是,则为 1)
-
此外,“玩的东西”的整个概念毫无意义。
-
@immibis, "bits to play around" - 就像你可以调用
VirtualAlloc并询问一个特定的地址 - 在 64 位地址空间内 -reserved内存将从那里开始。 (据我了解)。并不是说VirtualAlloc保证符合请求(也许?) -
是的,这很好。几乎是 VirtualAlloc() 存在的原因。 HeapAlloc() 将直接调用 VirtualAlloc() 进行如此大的分配,不同之处在于它将提交整个分配。如果您发现现在需要编写自己的子分配器来分配内存块,那么您就失去了优势,HeapAlloc() 并没有那么糟糕。
标签: c++ c 64-bit virtual-address-space virtualalloc