为啥会有栈和堆?

Posted

技术标签:

【中文标题】为啥会有栈和堆?【英文标题】:Why is there a stack and a heap?为什么会有栈和堆? 【发布时间】:2011-10-30 17:41:21 【问题描述】:

为什么汇编语言同时使用栈和堆?它们似乎是多余的。

【问题讨论】:

虽然这是个好问题,但已经回答了here ... 一个类似的问题,专注于 Windows,得到了回答 here (因为另一个是特定于操作系统的,我不会投票结束,但这是一个接近的电话)。跨度> 【参考方案1】:

它们不是多余的。它们每个都有优点和缺点:如果使用得当,堆栈会更快,因为内存分配是微不足道的(推送/弹出)。缺点是您只能在顶部添加和删除项目(因此名称,堆栈)。此外,总堆栈空间是有限的,当你用完时,你有一个......好吧,堆栈溢出。相比之下,堆允许随机分配和释放,您可以在那里存储大量数据,但缺点是分配带来更多开销 - 对于每个分配的内存块,必须找到合适的空闲部分,并且在从长远来看,需要避免空闲空间的碎片化,并且系统必须跟踪空闲块的位置。

您使用堆栈来传递小的短期值,例如局部计数器变量、函数参数、返回值等;这些适合推送/弹出分配方式。对于更大或更长时间的数据结构,您可以使用堆。

【讨论】:

【参考方案2】:

您当然可以构建一个使用其中任何一个作为其唯一内存模型的计算系统。然而,它们都有相当不同的属性,每个都有自己的优点和缺点。大多数系统都使用这两种方法,以便从它们中获得好处。

堆栈

堆栈可以被认为是一堆盘子,你在盘子上写一个值并将其放在堆栈的顶部,这称为压入操作并将一个值存储在堆栈上。您显然也可以从堆栈中移除顶板,这称为弹出操作。但是新的分配必须总是在栈顶。

堆栈倾向于用于局部变量和函数之间的传递值。通常,堆栈具有以下令人敬畏的属性:

只需要少量指针即可管理 非常容易在硬件中实现,大多数处理器都内置了对堆栈的硬件支持,使其速度更快。 分配内存非常快

堆栈的问题来自事实项目只能从堆栈顶部添加/删除。现在这在通过函数调用上下遍历时非常有意义:从堆栈中弹出函数输入,为堆栈上的局部变量分配空间,运行函数,从堆栈顶部清除局部变量并将返回值压入堆栈.另一方面,如果我想分配一些内存并说将其传递给另一个线程,或者通常将其释放到远离分配位置的地方突然之间我有一个问题,当我想要时堆栈不在正确的位置释放内存。

您可以说堆栈有助于快速顺序内存分配。

现在堆不同了,每个分配通常单独跟踪。这会导致分配和解除分配的大量开销,但每个分配都可以独立于其他内存分配进行处理,直到内存耗尽。

有很多算法可以实现这一点,在这里发推特可能有点不明智,但这里有一个链接,讨论了一些好的简单堆分配算法:Alternatives to malloc and new

因此,堆有助于随机内存分配,但这会带来运行时损失,但是这种损失通常比仅使用堆栈来处理这种情况所产生的损失要小。

【讨论】:

【参考方案3】:

这是关于内存处理和管理的。 x86 架构有不同类型的寄存器。 在 x86 架构等方面存在硬件支持的内存管理的可能性。

堆栈用于指令指针,堆用于某些应用程序中的数据段。

要了解更多信息,我建议您阅读以下链接:

http://en.wikipedia.org/wiki/Data_segment http://en.wikipedia.org/wiki/X86_memory_segmentation

“内存模型允许编译器执行许多重要的 优化” - ***

【讨论】:

以上是关于为啥会有栈和堆?的主要内容,如果未能解决你的问题,请参考以下文章

数据结构之堆的概念与实现

值类型和引用类型

栈和堆

数据结构中栈和堆---内存分配中栈和堆

JS变量小总

栈和队列的区别,栈和堆的区别