【问题标题】:Best way to allocate large memory分配大内存的最佳方法
【发布时间】:2014-07-28 23:00:14
【问题描述】:

在我的 Visual C++ 应用程序中,我知道要分配的总对象(CMyObject)是 16728064,每个对象是 64 字节,所以要分配的总内存是 1GB。内存会在开始时分配,在应用的整个生命周期中使用,最后释放。

在这种情况下,分配内存的最佳方式是什么?

当前我尝试在开头分配内存,如下:

    CMyObject *p = new CMyObject[16728064];

    // Perform tasks.

    delete [] p;

但是大部分时间分配会失败。现在我想做如下:

    CMyObject *p[10];

    p[0] = new CMyObject[1672806];

    p[1] = new CMyObject[1672806];

    …

    // Perform tasks

    Delete [] p[0];

    ….

这似乎工作了一段时间。

因此,我应该将分配分成尽可能小的部分吗?或者这种情况有什么好的解决办法吗?

谢谢

【问题讨论】:

  • 您是在 32 位还是 64 位平台上运行的?
  • 您需要所有内存作为工作集的一部分,还是可以将其中的一部分存储到磁盘中?
  • 当你分配一个大数组时,你的分配器需要找到一个大的连续内存区域。在 32 位窗口上,您分配了总地址空间的一半,因此无法保证找到连续区域。一个进程在 Windows 上可以分配的内存量可以是 2 GB、3 GB、4 GB 或 16 TB,具体取决于不同的因素。
  • 完全未经测试的代码:ideone.com/ap68Lb
  • 如果该空间确实在程序期间被使用并且没有您必须调用的 dtor,请忽略删除。接下来,您可以直接从操作系统分配原始页面,以消除使用new 的开销。

标签: c++ memory memory-management


【解决方案1】:

一般来说,是的,您应该将较大的分配分成较小的片段。根据您的系统,它可能没有 1GB 的连续内存。

【讨论】:

    【解决方案2】:

    假设这是 X86 处理器或类似的处理器,只有虚拟地址空间是连续的。对于 X86,物理内存由 4096 字节的页面组成,物理页面不必是连续的,只有映射的虚拟地址空间。

    当我在 4GB 的系统上运行 Windows XP 32 位时,它显示 3.6 GB 的可用物理内存,通常我的测试程序在分配 1 GB 时没有问题,分配内存失败发生在1.5GB 和 2GB。

    我的猜测是,大量可用物理内存分配失败的原因与操作系统有关,而不是处理器虚拟到物理映射限制。

    您使用的是什么操作系统?

    【讨论】:

    • 我使用的是 Windows XP(32bit),有 2GB 物理内存和 32GB 磁盘空间用于 C: 驱动器,虚拟内存似乎分配在 C: 驱动器上,因为 pagefile.sys 存储在 C:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-07
    • 2023-03-20
    • 1970-01-01
    • 2018-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多