【问题标题】:When to use VirtualAlloc Vs new? [duplicate]何时使用 VirtualAlloc 与新的? [复制]
【发布时间】:2012-04-26 23:14:15
【问题描述】:

可能重复:
What's the differences between VirtualAlloc and HeapAlloc?

我想预先分配一大块内存,比如 1gb 来实现内存池。 Virtual Alloc 使用 4kb 的页面大小进行分配。在这种情况下使用 virtualalloc 比 new 有什么优势?在这种情况下不应该使用 new 还是使用 new over virtual alloc 有什么缺点?

【问题讨论】:

  • 如果您分配大块内存,并在页面边界上对齐它是一个优势,我敢打赌new 也会这样做。一个区别是new 是语言的一部分,而VirtualAlloc 是特定操作系统的一部分。

标签: c++ windows visual-c++


【解决方案1】:

使用 VirtualAlloc,您可以保留 1gb 地址范围。稍后您可以根据需要提交其中的一部分 - 以便为给定的保留地址块分配实际的物理内存块。保留永远不会失败,而如果物理内存不足,提交可能会失败。实际上,对于 Windows 上的分页文件,这也应该总是成功的。

new 将保留并提交 1gb 块。

因此,如果您需要即时访问整个 1GB 块,请继续使用 new。

如果您一开始不需要访问整个 1GB 块,并且您可以编写算法以便它按需提交部分内存,那么 VirtualAlloc 可以优化您的内存消耗。

如果您考虑将 VirtualAlloc 用于您的目的,那么您可能会发现很难决定何时以及如何提交内存。我在 Jeffrey Richter 的书(Advanced Windows 3rd ed.)中找到的一种很好的方法是使用结构化异常处理。一旦你的代码接触到未提交的内存异常,你所要做的就是捕捉它,提交内存,然后告诉系统重试发生问题的指令。我从未尝试过,但据我所知,堆栈实际上是这样工作的。

【讨论】:

    猜你喜欢
    • 2011-12-04
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    • 2020-01-15
    • 2010-12-23
    • 2010-12-15
    • 2012-08-08
    相关资源
    最近更新 更多