C++ RAM 中的堆栈和堆
C++ Stack and Heap in 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];
使内存使用情况达到相同的值。(当然,我确实使用了较低的值)
也没有为第一个截取的代码生成代码,但为第二个截取生成代码。
相关文章:
- 如何加载(或映射)文件部分的最大大小,但适合在Windows上的RAM
- 算法问题:查找从堆栈中弹出的所有序列
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 为什么调用堆栈数组会导致内存泄漏
- gdb错误:Backtrace已停止:上一帧与此帧相同(堆栈已损坏?)
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 我的 int main() 中出现堆栈溢出错误
- 堆栈和队列是否像C++中的数组一样传递?
- 拥有映射的现代方法,该映射可以指向或引用已在堆栈上分配的不同类型的数据
- 为什么 STL 容器适配器堆栈中的 top 返回常量引用?
- 从堆栈分配的原始指针构造智能指针
- 在函数范围内在堆栈上分配的数组在离开函数时是否总是被释放?
- 堆栈中大小变量输入错误 (C++)
- 堆栈问题(平衡表达式问题集)
- C++ 在堆栈中包含多态属性的类对象存储
- 用于解析 win64 堆栈跟踪的命令行客户端(可以访问符号服务器)
- 在 C++ 中使用链表进行堆栈
- C++ RAM 中的堆栈和堆
- C++中的RAM、硬盘、堆栈和堆