在我的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];
….
这似乎有一段时间了。
因此,我应该将分配分成尽可能小的部分吗?或者对于这种情况有什么好的解决方案吗?
由于
答案 0 :(得分:2)
通常,是的,您应该将较大的分配拆分为较小的分段。根据您的系统,它可能没有1GB的连续内存。
答案 1 :(得分:2)
假设这是X86处理器或类似的东西,只有虚拟地址空间是连续的。对于X86,物理内存由4096字节页组成,物理页不必是连续的,只有映射的虚拟地址空间。
当我运行Windows XP 32位时,在4GB的系统上,它显示3.6 GB的物理内存可用,并且通常我的测试程序没有分配1 GB的问题,而在两者之间分配内存的失败1.5GB和2GB。
我的猜测是大量分配可用物理内存失败的原因与操作系统有关,而不是处理器虚拟到物理映射限制。
您使用的是哪种操作系统?