手记

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


阶段一、静态内存分配(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人推荐
随时随地看视频
慕课网APP