为什么会有堆栈和堆?

问题描述:

为什么汇编语言同时使用堆栈和堆?他们似乎多余。为什么会有堆栈和堆?

+6

虽然这是一个很好的问题,它已经回答了[这里](http://*.com/questions/79923/what-and-where-are-the-stack-and-heap) – Lars

+0

...和一个类似的问题,专注于Windows,被回答[这里](http://*.com/questions/2422252/windows-assembly-heap-and-stack)(因为另一个是操作系统特定的,我没有投票关闭,但这是一个密切的电话)。 – eran

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

您可以使用堆栈来传递较短的短暂值,例如,本地计数器变量,函数参数,返回值等;这些都适合推/分配风格。对于较大或较长寿命的数据结构,可以使用堆。

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

堆栈被指令指针使用,Heap在某些应用程序中用于数据段。

想了解更多我建议你阅读下面的链接:

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

你当然可以构建一个计算系统,利用它们中的任何一个作为其唯一的存储器模型。但是,它们都有各自不同的特性,各有其优缺点。大多数系统都利用两者来从每个系统中获益。

堆栈可以被认为是作为绒头板中,将在一个板写入一个值,并把它放在堆这就是所谓的推入操作的顶部和上存储的值堆栈。您显然也可以从堆栈中移除顶盘,这称为弹出式操作。但新的分配必须始终位于堆栈顶部。

该堆栈倾向于用于局部变量并在函数之间传递值。一般堆有以下真棒属性:

  • 要求只有极少数的指针来管理
  • 很容易在硬件中实现,大多数处理器都内置在硬件支持的堆栈上,使其速度更快。
  • 非常快分配内存

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

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

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

有完成这个众多的算法,它可能是一个有点不明智的,在这里叽叽喳喳关于他们,但这里是谈论一些好的简单的堆分配算法的链接:Alternatives to malloc and new

所以堆有利于随机内存分配,但是这带来了运行时间的损失,但是如果你只需要使用堆栈来处理这种情况,那么惩罚通常会很小。