社区
数据结构与算法
帖子详情
请问:什么是堆,什么是栈,它们有什么区别?
csdyb
2001-08-11 12:29:31
...全文
324
6
打赏
收藏
请问:什么是堆,什么是栈,它们有什么区别?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
6 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
one_add_one
2001-08-11
打赏
举报
回复
临时寄存货物的地方
WQ
2001-08-11
打赏
举报
回复
"堆"和"栈"
作者:arya
堆(heap)和栈(stack)是C/C++编程不可避免会碰到的两个基本概念。首先,这两个概念都可以在讲数据结构的书中找到,他们都是基本的数据结构,虽然栈更为简单一些。
在具体的C/C++编程框架中,这两个概念并不是并行的。对底层机器代码的研究可以揭示,栈是机器系统提供的数据结构,而堆则是C/C++函数库提供的。
具体地说,现代计算机(串行执行机制),都直接在代码底层支持栈的数据结构。这体现在,有专门的寄存器指向栈所在的地址,有专门的机器指令完成数据入栈出栈的操作。这种机制的特点是效率高,支持的数据有限,一般是整数,指针,浮点数等系统直接支持的数据类型,并不直接支持其他的数据结构。因为栈的这种特点,对栈的使用在程序中是非常频繁的。对子程序的调用就是直接利用栈完成的。机器的call指令里隐含了把返回地址推入栈,然后跳转至子程序地址的操作,而子程序中的ret指令则隐含从堆栈中弹出返回地址并跳转之的操作。C/C++中的自动变量是直接利用栈的例子,这也就是为什么当函数返回时,该函数的自动变量自动失效的原因(因为堆栈恢复了调用前的状态)。
和栈不同,堆的数据结构并不是由系统(无论是机器系统还是操作系统)支持的,而是由函数库提供的。基本的malloc/realloc/free函数维护了一套内部的堆数据结构。当程序使用这些函数去获得新的内存空间时,这套函数首先试图从内部堆中寻找可用的内存空间,如果没有可以使用的内存空间,则试图利用系统调用来动态增加程序数据段的内存大小,新分配得到的空间首先被组织进内部堆中去,然后再以适当的形式返回给调用者。当程序释放分配的内存空间时,这片内存空间被返回内部堆结构中,可能会被适当的处理(比如和其他空闲空间合并成更大的空闲空间),以更适合下一次内存分配申请。这套复杂的分配机制实际上相当于一个内存分配的缓冲池(Cache),使用这套机制有如下若干原因:
1. 系统调用可能不支持任意大小的内存分配。有些系统的系统调用只支持固定大小及其倍数的内存请求(按页分配);这样的话对于大量的小内存分类来说会造成浪费。
2. 系统调用申请内存可能是代价昂贵的。系统调用可能涉及用户态和核心态的转换。
3. 没有管理的内存分配在大量复杂内存的分配释放操作下很容易造成内存碎片。
堆和栈的对比
从以上知识可知,栈是系统提供的功能,特点是快速高效,缺点是有限制,数据不灵活;而栈是函数库提供的功能,特点是灵活方便,数据适应面广泛,但是效率有一定降低。栈是系统数据结构,对于进程/线程是唯一的;堆是函数库内部数据结构,不一定唯一。不同堆分配的内存无法互相操作。栈空间分静态分配和动态分配两种。静态分配是编译器完成的,比如自动变量(auto)的分配。动态分配由alloca函数完成。栈的动态分配无需释放(是自动的),也就没有释放函数。为可移植的程序起见,栈的动态分配操作是不被鼓励的!堆空间的分配总是动态的,虽然程序结束时所有的数据空间都会被释放回系统,但是精确的申请内存/释放内存匹配是良好程序的基本要素。
zhiqing
2001-08-11
打赏
举报
回复
堆用树的数据结构,栈用链表结构但先进先出。
csdyb
2001-08-11
打赏
举报
回复
给分了!
csdyb
2001-08-11
打赏
举报
回复
谢谢大家
zhou_hua_0911
2001-08-11
打赏
举报
回复
栈是先进后出的链表。
什么是
堆
?什么是
栈
?它们之间有什么
区别
和联系?
堆
和
栈
的概念存在于数据结构中和操作系统内存中。 在数据结构中,
栈
中数据的存取方式为 先进后出。 而
堆
是一个优先队列,是按优先级来进行排序的,优先级可以按照大小来规定。 完全二叉树是
堆
的一种实现方式。在...
什么叫
栈
?什么叫
堆
?
堆
与
栈
的联系与
区别
堆
与
栈
的联系与
区别
一、预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、
栈
区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于...
Java:
堆
和
栈
的
区别
文章目录前言一、Java
堆
栈
常见问题二、问题理解1.为什么要区分
堆
和
栈
静态分配动态分配Java中的
堆
2.
堆
和
栈
的
区别
3.为什么
堆
是线程共享的而
栈
不是?4.我们平时说的
堆
栈
信息、
堆
栈
方法区是...
堆
和
栈
的
区别
是什么? 为什
什么是
堆
和
栈
,它们在哪儿?
我的意思是我理解什么是
栈
,但是它们到底是什么,在哪儿呢(站在实际的计算机物理内存的角度上看)? 在通常情况下由操作系统(OS)和语言的运行时(runtime)控制吗? 它们的作用范围是什么? 它们的大小由什么...
什么是“
堆
”,"
栈
","
堆
栈
","队列",它们的
区别
?
一、
堆
:什么是
堆
?又该怎么理解呢? ①
堆
通常是一个可以被看做一棵树的数组对象。
堆
总是满足下列性质: ·
堆
中某个节点的值总是不大于或不小于其父节点的值; ·
堆
总是一棵完全二叉树。 将根节点最大的
堆
叫做最大
堆
...
数据结构与算法
33,008
社区成员
35,326
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章