堆和栈的区别

14 篇文章 0 订阅
8 篇文章 0 订阅

内存区域一般最起码都有两种:一种是栈内存;一种是堆内存

栈内存:

1)存放的内容:基本类型的变量(Java中还有对象引用)、函数调用(参数值、局部变量、返回地址等)等等;

2)申请方式:由系统自动分配释放的内存空间;

3)申请后系统响应:只要系统中栈的剩余空间大于所申请的空间,系统将为程序提供内存,否则提示栈溢出;

4)空间大小:Windows中栈是由高地址向低地址扩展的数据结构,是一块连续的内存区域。所以说栈的容量是固定的(不同的系统有自己的常数),因此栈的空间较小;

5)分配效率:系统自动分配,速度较快;

6)分配方式:其操作方式类似于数据结构中的栈。栈有两种分配方式:静态分配和动态分配。静态分配由编译器完成(如局部变量的分配),动态分配同malloc函数时行(但栈的动态分配由编译器完成不需要我们手工实现)


堆内存:

1)存放的内容:程序中new的对象和数组等等;

2)申请方式:一般由程序员手动申请分配与释放,若程序员不释放则可能造成内存泄露和溢出;

3)申请后系统响应:操作系统一般维护有一张记录空闲内存地址的链表,当系统收到程序申请时会遍历空闲链表,找到第一块空间大于所申请空间的堆结点,然后从链表中删除(如果申请空间小于当分配空间会将多余的部分重新挂到空闲链表中)该结点,将该结点分配给程序

4)空间大小:堆是由低地址向高地址扩展的数据结构,是不连续的内存区域。所以系统是用链表来存储空闲区域的,其大小受限于计算机有效的虚拟内存,因此空间比较灵活、较大

5)分配效率:一般速度较慢,且容易产生内存碎片;

6)分配方式:其分配方式类似于链表。堆都是动态分配的,没有静态分配的堆;


最后参考文献写一句比较经典的比喻来说明栈和堆的区别:

使用就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小;   
使用就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大;


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值