回答
我不知道你所说的“实际上堆栈”(什么是“真正的”叠加么?)的意思,但它的概念同样的事情:push
递减“堆栈指针”,并pop
增量它。
是的,后进先出堆栈使用的计算机架构来存储的东西,如返回地址,局部变量等。 From Wikipedia:
x86体系结构对执行堆栈机制提供硬件支持。诸如push,pop,call和ret之类的指令用于正确设置堆栈以传递参数,为本地数据分配空间以及保存和恢复呼叫返回点。 ret尺寸指令对于实现空间有效(快速)调用约定非常有用,因为被调用者负责回收参数占用的堆栈空间。
例如,当一个函数被调用时,体系结构将返回地址,当前寄存器值等压入堆栈。当函数返回时,该数据将从堆栈弹出,以便可以在前一个位置继续执行。
你所说的“堆栈”是程序的调用堆栈,所以在这个意义上它是一个堆栈。但是没有必要这样做:实际的实现是硬件,操作系统和语言运行时特定的—我已经使用了C编译器,其中调用栈被实现为[双向]链接的栈帧列表,分配在堆,类似于IBM大型机操作系统的做法。
英特尔/ Windows风格的固定大小硬件堆栈的缺点是它使环境不是非常容易递归。 OTOH,它使堆栈非常高效,因为您不必使用操作系统资源来分配堆内存:它只是增加了一个指针。
这是一大堆内存,但有一个指向堆栈顶部的堆栈指针。在推动它上升,在弹出它下降。但是通常你可以通过修改指针来作弊,这样你就可以获得一个已经弹出的值。
并非所有架构的堆栈都朝向相同的方向。最后它根本就没有关系。一些系统使得堆栈指针在推动时增加,并且减少弹出,其他系统在推动时减少,并且增加弹出。
示例:堆栈指针位于0x100,它是一个增加的系统。 然后你按下,堆栈指针位于0x104。你再次推动,在0x108。你弹出,回到0x104。 另一个系统应该从0x100开始,向下推到0xfc,然后推到0xf8,并且弹回到0xfc。如果你再次弹出,你回到0x100。如果你从堆栈指针中减去8,它就回到0xf8,所以你可以再次弹出它们。 (或者,C编译器在函数结束时会做什么,只需从堆栈指针添加/减去12,而不是在3条指令中弹出3个局部变量。
- 1. 堆实际上是一堆吗?
- 2. 栈和堆内存
- 3. Android中的堆栈内存
- 4. 为什么从一个堆栈弹出实际上是从多个单独的堆栈弹出的?
- 5. 堆栈上的C++存储保存在堆栈上
- 6. 的memcpy堆栈内存
- 7. 堆栈实现
- 8. 它是一个堆栈框架吗?
- 9. C++堆栈内存仍然有效吗?
- 10. 关于堆栈和堆栈内存使用的问题
- 11. JVM - 堆栈和堆栈
- 12. 希望堆栈堆栈?
- 13. .NET堆栈内存限制
- 14. C堆栈内存布局
- 15. 堆栈内存位置
- 16. 堆栈帧内存分配
- 17. WebAssembly堆栈/堆栈指针初始化和内存布局
- 18. Java中的堆栈溢出与Collections-Java中的堆栈实现
- 19. 堆栈或堆
- 20. 字符堆栈,字符串堆栈,整数堆栈,整数数组堆栈等
- 21. 是否有一个库或一个malloc实现,它将堆上的内存分配给/像堆栈一样?
- 22. C中的堆栈实现
- 23. 堆栈的顶部应该在堆栈的链表中实现?
- 24. C++堆栈实现
- 25. ptrace会中断CPU上下文,用户空间堆栈还是内核堆栈?
- 26. 多个堆栈和堆放在虚拟内存中的位置?
- 27. 如果大部分数据都堆在堆栈上,堆栈内存的主要重要性/作用是什么?
- 28. 堆栈= java.lang.StackOverflowError的:堆栈大小8MB
- 29. 从堆栈导航到CDB/WinDbg中的托管堆栈中的堆栈帧
- 30. 堆栈
我正在讨论使用push和流行。 – 2011-04-08 20:41:27