RAM 中的 C++ 堆栈和堆

标签 c++ heap-memory stack-memory htop

我在具有 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/

相关文章:

java - 如何从 Java 应用程序中确定 JVM 最小堆大小?

c - 指向相同内存地址的结构指针产生不同的数据?

java - 为什么要用栈而不是堆?

python - 将 Heapy 的内存配置文件浏览器与 Twisted.web 一起使用

c++ - 在C/C++中,链表只有头指针分配在栈中,其他节点分配在堆中。这可能会导致内存泄漏?

c - 堆和栈段

c++ - Visual Studio /C++ : Build of non-dependant project built on launching debug mode

c++ - (简单 C++ 概念)构造函数/析构函数调用的意外输出

c++ chrono给出负纪元时间

c++ - GCC 值得在 Windows 上使用来代替 MSVC?