【问题标题】:Is a stack necessary? [closed]是否需要堆栈? [关闭]
【发布时间】:2011-12-13 14:05:17
【问题描述】:

我对栈/堆的有限理解是引用类型放在堆上(动态分配),值类型放在栈上。

理论上(如在理论机器、编译器、编程语言中),堆栈是必需的吗?不是所有的内存都放在堆上吗?

【问题讨论】:

  • 这肯定会在调试中产生有趣的堆栈跟踪。堆栈不仅存储值类型,它还维护调用堆栈。
  • 我建议你看看[this][1] [1]:stackoverflow.com/questions/79923/…
  • @David,没有内在的理由只有一个堆栈,数据和返回地址混合在一起。 FORTH 虚拟机定义了两个堆栈,一个用于数据,一个用于返回地址(以及一些非常专用的字,用于操作返回堆栈上的数据)。摩托罗拉 6809 有两个堆栈指针,基于知道谁可能参与了设计,我仍然怀疑设计者这样做是为了更容易在芯片上实现 FORTH。

标签: computer-science heap-memory stack-memory


【解决方案1】:

理论上,你可以做到这一点。在实践中,这将是一个巨大的性能杀手。

在“黑客”中,史蒂文·利维讲述了这个故事。在麻省理工学院,几十年前,在硬件堆栈之前,用不到 50 条指令编写“十进制打印”例程是黑客的圣杯。终于有人到了。不久之后,一台新机器出现了,它的指令集相似,只是它包含了一条新指令,PUSHJ,Push Return Address 和 Jump。 PUSHJ 将返回地址推入堆栈,而不是将其存储在绝对内存位置(或在寄存器中:相同 - 如果需要调用其他内容,则必须将寄存器存储在某处)。使用 PUSHJ,十进制打印可以写成 10 条指令。

现代 RISC 理论避开堆栈指令而使用寄存器,并强制程序员(或更可能是编译器)在每次调用时在软件中实现 PUSHJ。这是一个性能损失,不管你怎么削减它,因为你将支付在软件中操作堆栈指针的额外成本(指令获取、寄存器杂耍、寄存器递增/递减)。

【讨论】:

    【解决方案2】:

    堆栈随着添加的东西而增长,随着东西的移除而缩小。因此,在堆栈上分配东西是非常高效的。这是通过分配的字节量在“堆栈”上的简单移动。

    相反,堆分配代价高昂。这和系统还必须处理内存碎片。

    当然,堆栈的缺点是它的大小有限。然而,由于在堆栈中推送和弹出内容的速度和效率,它使其成为调用函数并从函数返回的完美候选者。

    【讨论】:

      猜你喜欢
      • 2012-12-27
      • 2019-01-05
      • 2017-08-18
      • 1970-01-01
      • 2018-07-15
      • 2021-09-08
      • 2016-11-20
      • 2021-02-17
      • 2013-03-04
      相关资源
      最近更新 更多