何时堆内存优先于堆栈内存

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了何时堆内存优先于堆栈内存相关的知识,希望对你有一定的参考价值。

我知道本地数组是在堆栈上创建的,并且具有自动存储持续时间,因为它们在它们结束时的功能被销毁。它们必然具有固定的大小:

{
   int foo[16];
}

使用运算符new[]创建的数组具有动态存储持续时间并存储在堆上。它们可以有不同的尺寸。

{
    const int size = 16;
    int* foo = new int[size];
    // do something with foo
    delete[] foo;
}

堆栈的大小是固定的,并且对于每个过程都是有限的。

我的问题是:从堆栈内存切换到堆内存时是否有经验法则,以减少堆栈内存消耗?

例:

  • qazxsw poi非常合理;
  • 如果堆栈大小为double a[2]double a[1000000000]很可能会导致堆栈溢出

切换到动态分配的合理限制在哪里?

答案

有关堆分配的讨论,请参阅1mb

切换到动态分配的合理限制在哪里?

在几种情况下,包括:

  • 太大的this answer。根据经验,我建议避免超过几千字节的调用帧(以及超过一兆字节的automatic variables)。如果您确定您的函数不能递归使用,则可能会增加该限制。在许多小型嵌入式系统中,堆栈更加有限(例如,几千字节),因此您需要限制每个调用帧(例如,只有一百个字节)。顺便说一句,在某些系统上,你可以更多地增加调用堆栈限制(可能增加到几千兆字节),但这也是一个系统管理员问题。
  • 非LIFO分配纪律,经常发生。

请注意,即使容器位于堆栈中,大多数C ++标准call stack也会在堆中分配数据。例如,containers类型的自动变量,例如,本地vector已分配其数据堆(并在向量为std::vector<double> autovec;时释放)。了解更多关于destroyed的信息。

以上是关于何时堆内存优先于堆栈内存的主要内容,如果未能解决你的问题,请参考以下文章

Java 堆栈内存分配

Java 堆栈内存分配

七:JVM调优工具详解及调优实战

14.VisualVM使用详解15.VisualVM堆查看器使用的内存不足19.class文件--文件结构--魔数20.文件结构--常量池21.文件结构访问标志(2个字节)22.类加载机制概(代码片段

何时在声明或初始化时为变量分配内存?

初识JVM堆栈