我对堆栈/堆的有限理解是将引用类型放到堆上(动态分配),并将值类型放在堆栈上。
理论上(如在理论机器,编译器,编程语言中),堆栈是必需的吗?难道不能将所有内存放在堆上吗?
答案 0 :(得分:2)
理论上,你可以这样做。在实践中,它将是一个巨大的性能杀手。
在"黑客",Steven Levy讲述了这个故事。麻省理工学院,几十年前,在硬件堆栈之前,写一个"十进制打印" 50条指令中的例行程序是黑客的圣杯。有人终于到了那儿。不久之后,一台新机器出现了,具有类似的指令集,除了它包括一条新指令,PUSHJ,Push Return Address和Jump。 PUSHJ将返回地址压入堆栈,而不是将其存储在绝对存储器位置(或寄存器中:相同 - 如果需要调用其他东西,则必须存储寄存器SOMEWHERE)。使用PUSHJ,十进制打印可以用10条指令写入。
现代RISC理论避免使用堆栈指令支持寄存器,并迫使程序员(或者更可能是编译器)在每次调用时在软件中实现PUSHJ。这是一个性能损失,无论如何削减它,因为你将支付在软件中操作堆栈指针的额外成本(指令提取,寄存器杂耍,寄存器增量/减量)。
答案 1 :(得分:0)
堆栈随着内容的增加而增长,并随着内容的移除而缩小。因此,在堆栈上分配内容非常非常高效。这是一个简单的移动“堆栈”的字节数量。
相反,堆分配很昂贵。那和系统还必须处理内存碎片。
堆栈的缺点当然是它的大小有限。但是,由于在堆栈上推送和弹出东西的速度和效率,它使它成为调用函数和从函数返回的理想选择。