内存中的堆栈实际上是堆栈吗?

时间:2011-04-08 18:52:18

标签: memory stack queue terminology heap

在内存中有一个名为stack的部分从顶部开始向下扩展到堆。这个堆栈和LIFO堆栈一样吗?底部的堆是FIFO吗?

当你执行“推”和“弹出”时,是否会改变内存中的堆栈?

5 个答案:

答案 0 :(得分:4)

stack 实际上是一个LIFO堆栈。

它是在程序运行时由程序自己创建的。控制堆栈的代码是在编译时创建的。

进一步阅读:

Hardware Stacks

Call Stack

X86 Addressing Modes

答案 1 :(得分:3)

是的,计算机体系结构使用LIFO堆栈来存储诸如返回地址,本地变量等内容。来自Wikipedia

  

x86架构具有对执行堆栈机制的硬件支持。 push,pop,call和ret等指令与正确设置的堆栈一起使用,以传递参数,为本地数据分配空间,以及保存和恢复呼叫返回点。 ret size指令对于实现空间高效(和快速)调用约定非常有用,其中被调用者负责回收参数占用的堆栈空间。

例如,当调用函数时,体系结构将返回地址,当前寄存器值等压入堆栈。当函数返回时,该数据将从堆栈中弹出,以便执行可以在之前的位置恢复。

答案 2 :(得分:2)

这是一大堆内存,但有一个堆栈指针指向堆栈的顶部。在推动它上升,在弹出它下降。但通常只需修改指针就可以作弊,这样你就可以得到一个已经弹出的值。

并非所有体系结构的堆栈都朝着相同的方向发展。最后它根本不重要。一些系统使得堆栈指针在推送时增加,而在弹出时减少,其他系统在推送时减少,在弹出时增加。

示例:stackpointer位于0x100,它是一个增加的系统。 然后你推,堆栈指针是0x104。你再次推动,在0x108。你弹出,回到0x104。 另一个系统将从0x100开始,向下推到0xfc,然后向下推到0xf8,然后弹回到0xfc。如果再次弹出,则返回0x100。如果然后从stackpointer中减去8,它将返回到0xf8,因此您可以再次弹出它们。 (或者,C编译器在函数结束时会做什么,只需从堆栈指针中添加/减去12,而不是在3条指令中弹出3个局部变量。

答案 3 :(得分:1)

我不确定你的意思是“实际上一个堆栈”(什么是“真正的”堆栈?)但它在概念上是相同的:push递减“堆栈指针“,pop递增它。

答案 4 :(得分:1)

你所谈论的“堆栈”是程序的调用堆栈,所以在这个意义上它是一个堆栈。但是没有必要:实际的实现是硬件,操作系统和语言运行时特定的 - 我使用了C编译器,其中调用堆栈被实现为[双重]链接的堆栈帧列表,在堆,类似于IBM大型机操作系统的工作方式。

英特尔/ Windows风格固定大小的硬件堆栈的缺点是它使环境不是非常适合递归的。 OTOH,它使堆栈的增长非常有效,因为你不必使用OS资源来分配堆内存:它只是递增一个指针。