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

时间:2018-02-28 12:39:02

标签: c++ stack stack-overflow heap-memory

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

{
   int foo[16];
}

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

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

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

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

示例:

  • double a[2]完全可以理解;
  • 如果堆栈大小为double a[1000000000]
  • 1mb很可能会导致堆栈溢出

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

1 个答案:

答案 0 :(得分:3)

有关堆分配的讨论,请参阅this answer

  

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

在某些情况下,包括:

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

  • 非LIFO分配纪律,经常发生。

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