堆栈是不是就是指令?

lnklo 2010-01-24 01:15:25
一种特殊的数据传送指令在内存里执行的?
还是内存里有专门的一块固定的区执行压入和弹出操作?
...全文
81 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
z569362161 2010-01-24
  • 打赏
  • 举报
回复
堆栈是一种执行“后进先出”算法的数据结构。

设想有一个直径不大、一端开口一端封闭的竹筒。有若干个写有编号的小球,小球的直径比竹筒的直径略小。现在把不同编号的小球放到竹筒里面,可以发现一种规律:先放进去的小球只能后拿出来,反之,后放进去的小球能够先拿出来。所以“先进后出”就是这种结构的特点。

堆栈就是这样一种数据结构。它是在内存中开辟一个存储区域,数据一个一个顺序地存入(也就是“压入——push”)这个区域之中。有一个地址指针总指向最后一个压入堆栈的数据所在的数据单元,存放这个地址指针的寄存器就叫做堆栈指示器。开始放入数据的单元叫做“栈底”。数据一个一个地存入,这个过程叫做“压栈”。在压栈的过程中,每有一个数据压入堆栈,就放在和前一个单元相连的后面一个单元中,堆栈指示器中的地址自动加1。读取这些数据时,按照堆栈指示器中的地址读取数据,堆栈指示器中的地址数自动减 1。这个过程叫做“弹出pop”。如此就实现了后进先出的原则。

堆栈是计算机中最常用的一种数据结构,比如函数的调用在计算机中是用堆栈实现的。
堆栈可以用数组存储,也可以用以后会介绍的链表存储。
下面是一个堆栈的结构体定义,包括一个栈顶指针,一个数据项数组。栈顶指针最开始指向-1,然后存入数据时,栈顶指针加1,取出数据后,栈顶指针减1。

堆和栈是两个不同的概念。

简单的来讲堆(heap)上分配的内存,系统不释放,而且是动态分配的。栈(stack)上分配的内存系统会自动释放,它是静态分配的。运行时栈叫堆栈。栈的分配是从内存的高地址向低地址分配的,而堆则相反。

由malloc或new分配的内存都是从heap上分配的内存,从heap上分配的内存必须有程序员自己释放,用free来释放,否则这块内存会一直被占用而得不到释放,就出现了“内存泄露(Memory Leak)”。这样会造成系统的可分配内存的越来越少,导致系统崩溃。

题外:很多人认为在程序中尽量使用堆而不使用栈,因为堆栈溢出很危险。其实堆溢出比栈溢出更危险。哈哈~! http://topic.csdn.net/u/20100112/09/59dfad10-8602-4976-be78-e679956add99.html?seed=627053173&r=62648969#r_62648969
cattycat 2010-01-24
  • 打赏
  • 举报
回复
堆栈就是内存空间,栈是静态分配的,操作方式就像先进后出这种,所以叫栈。
healer_kx 2010-01-24
  • 打赏
  • 举报
回复
不是,栈是一个存储空间。你调用一个函数的时候,这个函数的参数和局部变量,也就是和这个函数息息相关的数据会存到栈上。
clhposs 2010-01-24
  • 打赏
  • 举报
回复
没有栈 就没有了函数

很多东西都不能方便的使用 因为寄存器数量是有限的!
superlee19 2010-01-24
  • 打赏
  • 举报
回复
简单说来,所有程序最终都会运行在机器的内存中
但是堆和栈还是有一定区别
拿栈来举例,比如一段代码执行,其中调用了其他函数,假设被调用的函数执行一个加法操作,有两个参数,那么在调用加法函数前需要保存当前函数的运行状态,就需要把相关信息压栈,之后再把加法函数的参数压栈进行运算,运算完成后需要执行出栈,恢复先前函数的执行。
汇编中所有的函数调用都是如此完成,只是在高级语言里这些操作由编译器完成了。

64,670

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧