为什么有堆栈和堆?

时间:2011-08-19 15:31:41

标签: memory stack heap allocation

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

3 个答案:

答案 0 :(得分:12)

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

使用堆栈传递小的短期值,例如本地计数器变量,函数参数,返回值等;这些可以推动/弹出分配方式。对于较大或较长寿的数据结构,请使用堆。

答案 1 :(得分:3)

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

<强>栈

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

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

  • 只需要一些指针来管理
  • 很容易在硬件中实现,大多数处理器内置硬件支持堆栈,使其更快。
  • 分配内存非常快

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

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

<强>堆

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

有许多算法可以实现这一点,在这里推特关于它们可能有点不明智,但这里有一个关于一些简单的堆分配算法的链接:Alternatives to malloc and new

因此堆有利于随机内存分配,但这会带来运行时损失,但是如果必须仅使用堆栈来处理这种情况,则会产生很小的损失。

答案 2 :(得分:2)

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

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

要阅读更多内容,我建议您阅读以下链接:

  

“内存模型允许编译器执行许多重要的操作   优化“ - 维基百科