Rust中文翻译15

来源:互联网 发布:linux递归设置权限 编辑:程序博客网 时间:2024/04/20 17:58
大多数使用垃圾回收的语言都默认在堆上分配内存.这就意味着每个值都要装箱.有很多原因导致他们这样设计,但是这超出了本书的范围.同样,也有很多优化设计导致它并不是100%这样工作的.垃圾回收器宁愿选择在堆上分配内存,也不使用栈和Drop操作来释放内存.

4.1.7 该用哪一种呢?

所以当栈又快又好用的时候,为什么我们还需要使用堆呢?一个重要的原因是,栈只给你提供了LIFO语义来管理内存.堆分配却可以提供更加通用的和任意的顺序来使用内存,同时附带一些开销.

通常情况下,你应当使用栈,Rust默认就是如此.LIFO语义很简单,这是在函数级别上的.这同样有两点影响:运行时效率和语义.

运行时效率:
管理栈上的内存是简单的:它仅仅有增加和减少一个单一值,即"栈指针".管理堆上的内存去不简单:堆上的内存可以在任意位置分配,分配任意大小,内存管理器必须确保内存是可以被重用的.
如果你对这一议题感兴趣,你可以在这篇文章中学习更多:http://www.cs.northwestern.edu/~pdinda/icsclass/doc/dsa.pdf

语义的影响:
栈分配影响到了Rust语言自身,也影响到了程序员的思维.LIFO模式是Rust语言自动内存管理的模式.就连被唯一拥有的堆内存也可以被以这种模式管理.非LIFO模式的灵活性会导致在运行时CPU无法推导出哪里的内存需要被释放;它就需要依赖于动态协议,来自语言外部的机制来驱动内存释放(引用计数,通过Rc<T>和Arc<T>来实现,就是一种例子).

最极端的,堆分配内存既耗费了运行时(垃圾回收机制)又增加了程序员的编写开销(显示管理内存的话Rust并不提供验证).
0 0
原创粉丝点击