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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

微信公众号 技术很有趣:
在这里插入图片描述

头条号:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值