我在具有 4GB RAM 的 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 秒以防它需要更新)
另一方面,如果我动态分配巨大的数组(按照 tutorials like this 的建议我应该这样做)——htop 告诉我它用完了大部分 RAM(如果不是全部的话它会崩溃):
double *pnArray2 = new double[nSize];
for(int i=0; i<nSize; i++)
pnArray2[i] = 2*2; // store on the heap
那么为什么我应该使用堆来存储大数据结构...如果(如本例所示)堆栈可以处理更大的数组?
我认为堆应该比堆栈大!请告诉我哪里错了。
最佳答案
这可能只是优化器在做它的工作(或者没有,在第二种情况下)。它可能更难优化第二次分配,因为理论上您可以访问指针范围之外的内存。
我设法在 MSVS 2010 中在 Release模式下重现了这一点,并添加了一个简单的
std::cout << Array1[42];
使内存使用量达到相同的值。 (当然,我确实使用了较低的值)
也没有为第一个片段生成代码,但为第二个片段生成了代码。
关于RAM 中的 C++ 堆栈和堆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18904791/