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

问题描述 投票:0回答:1

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

{
   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]很可能会导致堆栈溢出

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

c++ stack stack-overflow heap-memory
1个回答
3
投票

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

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

在几种情况下,包括:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.