原创 栈、堆栈和堆有什么区别?

2009-10-12 09:48 4473 6 8 分类: MCU/ 嵌入式

栈、堆栈和堆有什么区别?




  答:栈和堆栈都指的是Stack,它们与堆(heap)是不同的概念,要注意区分开来。


  栈(stack)是限定仅在一端进行插入或删除的线性表。虽然这个限制减小了栈的灵活性,但是它也使得栈更有效且更容易实现。许多应用都只是需要提供受限制的插入和删除操作,在这种情况下使用较简单的栈结构比使用一般的线性表更有效。


  从堆和栈的功能和作用来通俗的比较,堆主要用来存放对象的,栈主要是用来执行程序的.而这种不同又主要是由于堆和栈的特点决定的:


  在编程中,例如C/C++中,所有的方法调用都是通过栈来进行的,所有的局部变量,形式参数都是从栈中分配内存空间的。实际上也不是什么分配,只是从栈顶向上用就行,就好像工厂中的传送带(conveyor belt)一样,Stack Pointer会自动指引你到放东西的位置,你所要做的只是把东西放下来就行.退出函数的时候,修改栈指针就可以把栈中的内容销毁.这样的模式速度最快,当然要用来运行程序了.需要注意的是,在分配的时候,比如为一个即将要调用的程序模块分配数据区时,应事先知道这个数据区的大小,也就说是虽然分配是在程序运行时进行的,但是分配的大小多少是确定的,不变的,而这个"大小多少"是在编译时确定的,不是在运行时.


  堆是应用程序在运行的时候请求操作系统分配给自己内存,由于从操作系统管理的内存分配,所以在分配和销毁时都要占用时间,因此用堆的效率非常低.但是堆的优点在于,编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要在堆里停留多长的时间,因此,用堆保存数据时会得到更大的灵活性。事实上,面向对象的多态性,堆内存分配是必不可少的,因为多态变量所需的存储空间只有在运行时创建了对象之后才能确定.在C++中,要求创建一个对象时,只需用new命令编制相关的代码即可。执行这些代码时,会在堆里自动进行数据的保存.当然,为达到这种灵活性,必然会付出一定的代价:在堆里分配存储空间时会花掉更长的时间!


1、什么是堆栈?


  答:堆栈是一个在计算机科学中经常使用的抽象数据类型. 堆栈中的物体具有一个特性:最后一个放入堆栈中的物体总是被最先拿出来, 这个特性通常称为后进先处(LIFO)队列.


  堆栈中定义了一些操作. 两个最重要的是PUSH和POP. PUSH操作在堆栈的顶部加入一个元素. POP操作相反, 在堆栈顶部移去一个元素, 并将堆栈的大小减一.


  现代计算机被设计成能够理解人们头脑中的高级语言. 在使用高级语言构造程序时最重要的技术是过程(procedure)和函数(function). 从这一点来看, 一个过程调用可以象跳转(jump)命令那样改变程序的控制流程, 但是与跳转不同的是, 当工作完成时,函数把控制权返回给调用之后的语句或指令. 这种高级抽象实现起来要靠堆栈的帮助.


  堆栈也用于给函数中使用的局部变量动态分配空间, 同样给函数传递参数和函数返回值也要用到堆栈.

PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

用户1449646 2010-6-16 15:05

写的不错 受益了 谢谢

用户230766 2009-10-29 09:19

不知道可否这样理解?对于HEAP , 在实际的应用中,可不可以理解为程序块开辟的内存块。而stack看作是公用的内存块,用于存储中断或线程间切换的临时数据存储区域。
相关推荐阅读
用户194887 2010-05-25 14:44
集成运放 单电源问题
集成运放单电源供电交流放大电路的问与答1、 问:双电源运放改单电源,为什么要取其中点电压供电?答:一般运放以双电源工作时是以((V+)+(V-))/2=0V 作为参考电压的,运放工作在中间的线性区。运...
用户194887 2009-12-06 21:35
AVR软件延时精确计算
和软件延时时间长短有关的因素有,单片机,晶振,延时语句,此处以for循环语句为例。首先,我们编写一个for循环的延时语句,如下:非关键代码省略。正常编译,按照常规方法打开JTAG下载并进入调试。我们要...
用户194887 2009-10-27 07:46
SPI协议简介
SPI协议简介一 SPI协议概括SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。...
用户194887 2009-10-19 19:53
AVR单片机烧录和熔丝位的操作初步
AVR单片机烧录和熔丝位的操作初步AVR单片机由于接口丰富,功能齐全,性价比好,运用越来越广。一些朋友利用网上下载的程序烧录芯片时,由于对熔丝位的意义没搞清楚,而任意改动其设置,结果造成芯片被锁定,即...
用户194887 2009-09-29 14:49
UCOS学习笔记
别人的 感觉蛮好的 收藏 ◆ 任务,在UCOS-ii实时系统中,一个任务其实就是一个线程,该任务可以认为CPU完全属于它自己。UCOS-ii中的任务拥有自己的堆栈和CPU寄存器,并且赋予一定的优先级,...
EE直播间
更多
我要评论
2
6
关闭 站长推荐上一条 /3 下一条