【发布时间】: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