C++ RAM 中的堆栈和堆



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

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

那么我为什么要使用堆来存储大数据结构......如果(如本例所示)堆栈可以处理更大的数组?

我以为堆应该比堆大!请告诉我哪里

错了。

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

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

std::cout << Array1[42];

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

也没有为第一个截取的代码生成代码

,但为第二个截取生成代码。

最新更新