堆?栈?(讨论)

一:

堆是程序员分配的,并由程序员释放的空间。
栈是临时变量的存储空间。
堆栈也就是栈。

二:
堆是程序员分配的,并由程序员释放的空间。     //比如说malloc,new,空间是始终存在的。。。
栈是临时变量的存储空间。     //比如说 int a=9; 函数返回后,空间系统收回。。。
堆栈也就是栈。
======================================
顶ls的,看这几句就够了。。。

另外还有全局区,和静态区,空间是始终存在的。

三:
我迂腐一把吧,说一下翻译的问题。
“堆”的英语是heap;“堆栈”=“栈”,英语是stack。
我们避开计算机方面的意义,只看日常用义。查《The Little Oxford Dictionary》(相当于《新华字典》的样子),有:
heap: [noun] disorderly pile; (esp. in plural) [colluquial] large number or amount; ...
stack: [noun] (esp. orderly) pile or heap; haystack; ...
可以看出,两个都是堆、叠的意思,区别就在于,heap是杂乱无序的,而stack是有序的。举个例子说,如果是一叠纸牌,没洗过乱放的就是heap,洗过的放整齐了就是stack。因为两个词本来意思比较接近,所以也有通用之处。

在计算机上,堆和栈一般指两种数据结构。“堆”是金字塔形的结构,只要求上面的都比下面的值大(或相反),不那么有序;“栈”是线性的结构,有严格的先后进出次序。这就是其区别的直观解释。

再说汉语的问题。
汉语译者把heap译成“堆”,是直译;而把stack称为“栈”,则完全是在汉语中另找了一个比喻。
所谓“栈”,即“栈道”,是山壁上修出的一段很窄的路,一次仅能容一人通过。用以比喻计算机中“栈”结构的进出的先后次序不能随意。
至于“堆栈”呢,我认为完全是一个拼凑出来的东西,反而让人从字面上看不出一点本来的意思了。

四:
栈 是系统给分配、管理,其中的内容生命期都是不受控制的。访问速度快,但是容量有限;
堆 由程序分配、管理,对象生命期由程序员控制,一般可认为容量无限,但是速度稍慢。
通常在 内存地址的增长方向上,
栈 和 堆是相反的。

五:
1.首先,不管是堆还是栈,都存在于内存中。
2.栈是一个线性表,遵循先进后出的原则;堆是一块无序的内存空间,使用堆中的空间时,须 内存提出申请。
3.程序结束时,会自动释放栈中的内存空间,不会释放堆中的内存空间。
4.最后,使用堆时,会同时使用到指针或链表。

六:
堆栈在这个板块基本是称呼内存的2个不同区域
但在数据结构中 他们有另外的意义:
栈:线性表的一种,它只允许对最后一个元素(被称作栈顶)进行操作 可以在栈顶之后加入一个元素形成新的栈顶(push) 也可以把原来的栈顶移除 "露出"一个新的元素作为栈顶(pop)。
堆:一种排序二叉树结构,有大顶堆和小顶堆之分,典型的应用是堆排序(目前没发现它跟我们常说的堆内存区有什么联系)

C++五大内存区楼上已经有人讲了 stack和heap两个区域的划分是因为它们管理方式的不同

栈用于保存函数的局部变量 它跟汇编语言的栈段是同一种东西 它的操作很类似于数据结构里的栈,因此得名。但是 它除了使用栈顶指针和栈指针进行push和pop操作之外 还可以使用栈偏移指针进行随机访问,所以 只有函数调用的时候和函数返回的时候会使用栈顶指针。因为其上的对象销毁只是移动寄存器里保存的指针 所以栈的效率很高。但是 一般栈段的总长度是有限的,过长的递归可能导致栈溢出错误(很常见吧^^)

堆在malloc申请后分配 到free指定时释放 它不会自动释放 是造成内存泄露的主要原因之一 而且 它的空闲和使用情况由操作系统用一个链表来管理 所以一般来说堆的效率不高 尽管语言标准没作任何提示 通常认为堆跟自由存储是同一个区域(好像我看的资料和前面的不一样 Exceptional C++的说法 堆是malloc/free分配的 自由存储是 new/delete分配的)

七:
堆栈是一个数据结构中的概念
堆(heap),栈(stack)是两种内存使用方法
不是同一个领域的概念,恰好被翻译来重了

八:
解释一下为什么把堆和栈连起来说的原因:
    据我所知,DOS下程序是独占方式,堆分为近堆和远堆,近堆和栈是在数据段开辟的同一块内存地址,栈从下往上增长,堆从上向下分配,中间没有规定分界线,所以程序控制不当,如深层次的递归,大量的动态地址分配很容易造成堆栈冲突,即堆栈地址重叠,从而造成死机和程序运行异常。堆和栈连在一起说的原因就是如此。
    至于远堆则是指在数据段和代码段以外计算机所有没有使用的剩余基本内存。
    Windows采用的是虚拟地址,内存分配方式就不一样了,楼上各位说的很清楚了,只有学习。
补充:DOS下堆栈的分配是由程序而不是操作系统自己控制的,具体分配大小、方式随编译系统、程序模式不同而异。C语言的堆栈分配代码在启动代码中.

欢迎发言及指正!

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值