12630|4

1

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

请高手分别讲讲堆、栈、堆栈这三样东西,不明白他们的区别是什么。最好解释得通俗易 [复制链接]

菜鸟提问,如题
此帖出自单片机论坛

最新回复

堆栈是和队列相对的一个概念,二者的区别在于堆栈是先进后出(FILO)的,而队列先进先出(FIFO) 举例说明,如果安排A、B、C三个元素按次序压入(push)堆栈,再全部弹出(pop),顺序变为C,B,A;如果A、B、C顺次进入队列再出队列,顺序仍为A、B、C 堆和栈的区别如3楼所说,堆是硬件实现的,栈是一种数据结构,但是很多情况已经不区分它们了  详情 回复 发表于 2008-1-8 11:04
点赞 关注
 

回复
举报

4

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

回复:请高手分别讲讲堆、栈、堆栈这三样东西,不明白他们的区别是什么。最好解释得

这三个 , 我认为是一个意思 。
此帖出自单片机论坛
 
 

回复

1170

帖子

0

TA的资源

至上芯片

板凳
 

回复:请高手分别讲讲堆、栈、堆栈这三样东西,不明白他们的区别是什么。最好解释得

以下是从网上摘录的 --------------------------------------------------------------- 堆”和“栈”是独立的概念平常说的“堆栈”实际上是两个概念:“堆”和“栈”。在英文中,堆是heap,栈是stack,不知道什么时候,什么原因,在中文里,这两个不同的概念硬是被搞在一起了,所以,围绕这个混合词所发生的误解和争执这几年就没有断过。 “栈”一般是由硬件(CPU)实现的,CPU用栈来保存调用子程序(函数)时的返回地址,高级语言有时也用它作为局部变量的存储空间。 “堆”是个实实在在的软件概念,使用与否完全由编程者“显示地(explicitly)”决定,如malloc。 程序经过编译连接生成执行程序后,堆和栈的起始地址就已经确定了(具体说,是通过“连接程序”),在一个具有反向增长的栈的CPU上,数据空间可表示如下: 低    ->|-----------------|       | 全局量(所有已初始化量 .data, |       | 未初始化量 .bss )       |   堆起始->|-----------------|       |    堆向高地址增长      |       |                 |       |                 |       |     自由空间        |       |                 |       |                 |       |    栈向低地址增长      | 高 栈起始->|-----------------| 在内存中,“堆”和“栈”共用全部的自由空间,只不过各自的起始地址和增长方向不同,它们之间并没有一个固定的界限,如果在运行时,“堆”和“栈”增长到发生了相互覆盖时,称为“栈堆冲突”,系统肯定垮台。由于开销方面的原因,各种编译在实现中都没有考虑解决这个问题,只有靠设计者自己解决,比如增加内存等。 ================================================================= 说明(128为例)硬堆栈: 即SP,通常汇编中讲的所谓堆栈(用于PC指针等压栈),一般设置从片内RAM的顶部0X10FF开始向下生长,基本上64个足够足够了 软件堆栈: C编译器自动分配的堆栈,在硬堆栈和全局变量之间的空间,也是向下生长,一般用于局部变量。比如一个子程序定义一个局部变量A[256],那么此空间即在软堆栈中,假设当前软堆栈用到0X800,分派A[256]后,软堆栈用到0X700,A[0]地址为0X700,A[1]地址为0X701 ……,当然如果局部变量较少,用寄存器就可以了,用不着软堆栈了。此子程序退出后软堆栈恢复到0X800。 另:你的C程序编译后,生成的汇编文件中,R28:R29就是软堆栈指针 一般硬堆栈只要在编译选项中设置,软堆栈编译器会自动设置。你只要看看*.mp文件是否合理就可以了。
此帖出自单片机论坛
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(初级)

4
 

回复:请高手分别讲讲堆、栈、堆栈这三样东西,不明白他们的区别是什么。最好解释得

如果大家研究过arm的启动代码等类似的东西就清楚了。
此帖出自单片机论坛
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(初级)

5
 

回复:请高手分别讲讲堆、栈、堆栈这三样东西,不明白他们的区别是什么。最好解释得

堆栈是和队列相对的一个概念,二者的区别在于堆栈是先进后出(FILO)的,而队列先进先出(FIFO) 举例说明,如果安排A、B、C三个元素按次序压入(push)堆栈,再全部弹出(pop),顺序变为C,B,A;如果A、B、C顺次进入队列再出队列,顺序仍为A、B、C 堆和栈的区别如3楼所说,堆是硬件实现的,栈是一种数据结构,但是很多情况已经不区分它们了
此帖出自单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表