在内存中有一个名为stack的部分从顶部开始向下扩展到堆。这个堆栈和LIFO堆栈一样吗?底部的堆是FIFO吗?
当你执行“推”和“弹出”时,是否会改变内存中的堆栈?
答案 0 :(得分:4)
答案 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资源来分配堆内存:它只是递增一个指针。