1

我在具有 4GB 内存的 Ubuntu 上运行以下 c++ 代码

const long long  nSize = 400000000;
double Array1[nSize];
for(int i=0; i<nSize; i++)
    Array1[i]= 2*2; // store on the stack

这适合 RAM(我的电脑不会抱怨)。令人困惑... htop 说在运行时几乎没有使用任何额外的 RAM... 为什么?(我通常让它休眠 100 秒以防它需要更新)

另一方面,如果我动态分配巨大的数组(像这样的教程建议我应该这样做) - htop 告诉我它正在使用大部分 RAM(如果不是全部并且它崩溃):

double *pnArray2 = new double[nSize];
for(int i=0; i<nSize; i++)
    pnArray2[i] = 2*2; // store on the heap

那么为什么我应该使用堆来存储大数据结构......如果(就像在这个例子中)堆栈可以处理更大的数组?

我认为堆应该比堆栈大!请告诉我我哪里错了。

4

1 回答 1

2

它可能只是优化器在做它的工作(或者不是,在第二种情况下)。它可能更难优化第二次分配,因为理论上您可以在指针范围之外访问该内存。

我设法在 MSVS 2010 中以发布模式重现了这个,并添加了一个简单的

std::cout << Array1[42];

使内存使用量达到相同的值。(当然,我确实使用了较低的值)

也没有为第一个剪断生成代码,但有第二个。

于 2013-09-19T21:05:23.757 回答