数据结构堆栈和栈的区别 堆栈栈顶在上还是下

2025-02-1014:49:12营销方案0

在计算机科学领域,堆栈这一概念的重要性不言而喻。许多人甚至包括计算机专业人士在内,都未能明确理解到堆栈实际上是由两种数据结构构成的。堆栈是一种数据项按序排列的数据结构,其特性使得数据项的插入和删除仅能在一端进行,这一端被称作栈顶。要点在于:堆栈的结构虽然看似无序,却有着严格的入栈与出栈规则;而栈,则遵循着后进先出(Last-In/First-Out)的原则。这和队列的先进先出原则有着明显的区别。
堆栈,它是一块连续的内存空间,用于保存数据。其中,一个名为堆栈指针的寄存器,负责指向堆栈的顶部位置。尽管堆栈的底部固定在内存中的某一地址,但其大小却在程序运行时由系统内核动态地进行调整。CPU执行PUSH和POP指令,分别用于向堆栈中添加元素和从其中移除元素。
逻辑堆栈帧是构成堆栈的基本单位。当函数被调用时,其参数和局部变量会被压入逻辑堆栈帧中;而当函数返回时,相应的堆栈帧则会从栈中弹出。每个堆栈帧都包含了重要的信息,如函数的参数、局部变量以及恢复前一个堆栈帧所需的数据。指令指针的值也在其中扮演了关键角色。
堆栈的增长方向可以是向下(向内存的低地址方向)或向上,这取决于具体的实现方式。在我们的讨论中,我们以堆栈向下增长为例,这是包括Intel、Motorola、SPARC和MIPS等处理器在内的许多计算机系统的实现方式。而堆栈指针的指向,也因实现方式的不同而有所差异,它可能指向堆栈的最后地址,或是下一个空闲可用地址。
除了堆栈指针外,为了方便使用,还有帧指针这一概念。帧指针是一个指向固定地址的指针,在某些文章中它被称作局部基指针。理论上,局部变量可以通过SP加偏移量的方式来引用。但当有字被压栈或出栈时,这些偏移量就会发生变化。虽然编译器在某些情况下能这些变化并修正偏移量,但在其他情况下却难以做到这一点。
在一些计算机架构中,如Intel CPU,使用第二个寄存器——帧指针——来引用局部变量和函数参数是一个常见的做法。因为这些变量到帧指针的距离不会受到PUSH和POP操作的影响。在Intel CPU中,BP(EBP)就承担了这样的角色。而在Motorola CPU中,除了A7(即堆栈指针SP)之外的任何地址寄存器都可以作为帧指针。
考虑我们堆栈的增长方向和帧指针的位置,从帧指针的位置开始计算偏移量时,函数参数的偏移量是正值而局部变量的偏移量则是负值。当一个例程被调用时,保存前一个帧指针是必要的步骤;接着复制当前SP到FP以创建新的帧指针并为局部变量预留空间。这被称作例程的序幕工作。而当例程结束时,必须清理堆栈以恢复其原始状态,这被称为例程的收尾工作。
值得一提的是,普通的8051 MCU中,其堆栈指针仅有8位宽度,因此其堆栈大小被限制在256字节以内。这一点在13086型号的芯片中也同样适用。

  • 版权说明:
  • 本文内容由互联网用户自发贡献,本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 295052769@qq.com 举报,一经查实,本站将立刻删除。