【问题标题】:Difference between using the Stack or the Heap [duplicate]使用堆栈或堆之间的区别[重复]
【发布时间】:2016-05-28 10:02:47
【问题描述】:

使用栈代替堆有什么问题吗?

基本上我想要内存中的大约 200 个位置(或者更多,1000,谁知道,这无论如何都是假设的),我可以使用数组在堆栈中分配它,或者使用 malloc() 在堆中分配它。在堆上,我必须记住始终free() 内存......但是使用堆栈,一旦函数返回,所有内存都会为我很好地清理。

我只是想知道在堆栈上保存大量内存是否有任何问题。据我所知,栈和堆基本上是一样的,只是它们在一个 RAM 框架中位于相对的两侧,并且它们朝着另一侧增长,如下图所示。

【问题讨论】:

  • 堆栈空间有限。如果你不知道你想要多少,只需使用 vector(C++) 并且不用担心内存管理。
  • 您的理解充其量只是片面的。但是关于这个话题已经存在很多问题了。阅读其中的一些内容,看看他们是否回答了您的问题。例如:What and where are the stack and heap?
  • 这个旧的简化模型在你的程序中没有超过 1 个执行线程。
  • 一般的经验法则是在自动存储(即全局变量)或动态内存(又名堆)中分配大型数据结构。通过引用或指针传递大项目。指针和引用占用的空间比大对象少。传递给函数时可以复制整个对象而不使用指针或引用。
  • 仅仅因为图表显示堆栈沿某个方向增长并不等于允许它一直增长。最大堆栈大小通常被限制为比最大堆大小小得多的值。

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


【解决方案1】:

使用堆栈的主要“问题” - 由执行流程而不是开发人员控制的变量的生命周期。尽管在某些情况下,当变量超出范围时自动销毁变量会更容易,但拥有由开发人员而不是编译器控制生命周期的数据是必要且更简单的。另一个问题 - 在标准 C++ 上,您只能在堆栈上分配大小在编译时已知的数据,而堆则不是这样。

【讨论】:

  • 是的,我知道,这就是为什么我宁愿使用堆栈来避免内存管理,当然,如果可能的话......但我的问题不在于它们是如何工作的,而是如果有通常使用堆时使用堆栈的任何副作用,例如用于保存大量数据。
  • 我认为匿名投票者很快就会毁掉这里的社区。​​span>
【解决方案2】:

首先——堆和栈不是c++terms。它们是实现细节。

使用堆栈和堆的实现(可能大多数 - 如果不是全部 - 都这样做)通常具有堆栈大小的上限。所以在堆栈上放置巨大的变量会导致堆栈溢出(这通常会导致不可预知的错误)。

但是,堆栈比堆更有优势,因此请尽可能使用它 - 前提是您不要在堆栈上放置大量变量。

注意 - 大多数 c++ 容器,例如向量、列表、双端队列可以毫无问题地放在堆栈上,因为它们只在堆栈上放置几个字节,并在堆上分配真正的数据容器。

【讨论】:

  • 是的,我知道,但据我所知,堆栈会溢出,就像堆会溢出一样......但是在 cmets 之后,现在我知道了内存共享的简单模型不再使用了。
猜你喜欢
  • 2011-03-29
  • 1970-01-01
  • 2016-03-18
  • 1970-01-01
  • 2018-07-04
  • 2011-08-30
  • 2021-05-10
  • 2014-01-09
相关资源
最近更新 更多