我在Ubuntu上运行以下带有4GB RAM的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
所以为什么我应该使用堆存储大数据结构......如果(如本例所示)堆栈可以处理更大的数组?
我认为堆应该比堆栈大!请告诉我我哪里错了。
答案 0 :(得分:1)
可能只是优化器正在完成它的工作(或者不是,在第二种情况下)。它可能更难以优化第二个分配,因为理论上你可以访问指针范围之外的那个内存。
我设法在MSVS 2010中,在发布模式下重新启用此功能,并添加了一个简单的
std::cout << Array1[42];
将内存使用量提升到相同的值。 (授予,我确实使用了较低的值)
还没有为第一个剪辑生成代码,但第二个是。