为了账号安全,请及时绑定邮箱和手机立即绑定

为什么现在的内存分配方式可以支持递归?

标签:
Java C


阶段一、静态内存分配(Static allocation)

程序员编程需要预计变量大小,指定特定内存大小给变量,无法通过代码动态给变量分配内存。程序中声明的变量在编译期间就已经被绑定到目标内存。

优点:程序鲁棒性(健壮性)高,毕竟内存分配都在掌控中。

缺点:只能使用数组这种确定内存占用大小的数据结构,不能使用链表等动态数据结构。不能够使用递归,每次重新调用相同函数都会覆盖之前的数据。


阶段二、栈内存分配(Stack Allocation)

内存被划分成不同的内存帧。每次使用根据栈的先进先出特性,被调用函数的占用内存要先被释放掉。

优点:可以使用递归了。每次调用相同函数可以根据不同入参的不同而创建不同栈帧。

缺点:程序鲁棒性(健壮性)相对较差一点。使用递归也可能会导致栈溢出。需要保持数据的有序性,无法使用链表等动态数据结构。


阶段三、堆内存分配(Heap Allocation)

变量保存在可变大小的内存区域中,即堆。数据也不被要求连续存放在内存中。

优点:可以使用链表、图等动态数据结构了。

缺点:程序鲁棒性(健壮性)更差一点,程序运行时的不可控性加大。堆内存分配本身也消耗性能。程序员的编码难度加大,要小心翼翼管理已分配的内存,比如C++使用malloc函数分配内存,用free函数释放malloc已分配的内存。如果没有回收好的话,会造成极大的浪费,毕竟内存也是稀缺的。


阶段四、垃圾回收(Garbage Collection)

随着编程语言的不断发展,出现了以Java会代表的支持自动垃圾回收内存的编程语言,降低了程序员的编码难度。

优点:提高了编码效率的同时也兼顾了程序的鲁棒性。

缺点:当然GC本身也很消耗系统资源,降低系统运行效率,在实时性要求较高的应用场景和系统级编程不那么实用,而在web开发中需要频繁申请和释放内存,使用GC可以提高开发效率,这比系统延时更重要,提高系统性能可以通过其它渠道进行。



参考链接——https://blog.csdn.net/wuwuzhixiang/article/details/76599855


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
全栈工程师
手记
粉丝
70
获赞与收藏
147

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消