作者:嘻嘻2502891803 | 来源:互联网 | 2023-09-03 12:56
我读过 Rust 的编译器在编译时“插入”内存管理代码,这听起来有点像“编译时垃圾收集”。
这两种想法有什么区别?
我看过Rust 有什么而不是垃圾收集器?但那是关于运行时垃圾收集,而不是编译时。
回答
编译时垃圾回收通常定义如下:
自动内存管理的一种补充形式是编译时内存管理 (CTGC),其中内存管理决策是在编译时而非运行时做出的。编译器确定在程序执行期间创建的变量的生命周期,因此也确定将与这些变量关联的内存。每当编译器可以保证一个变量,或者更准确地说,这个变量在运行时指向的部分内存资源,永远不会在某个程序指令之外被访问,那么编译器可以添加指令来释放这些资源该特定指令不会影响结果代码的正确性。
(来自Nancy Mazur 的声明性语言 Mercury 的编译时垃圾收集)
Rust 通过使用所有权和借用检查的概念来处理内存。所有权和移动语义描述哪个变量拥有一个值。借用描述允许哪些引用访问值。这两个概念允许编译器在值不再可访问时“删除”该值,从而导致程序dtop
从Drop
trait调用该方法)。
但是,编译器本身根本不处理动态分配的内存。它只处理掉线检查(确定何时调用drop
)和插入.drop()
调用。该drop
实施是负责确定在这一点上发生了什么,无论是重新分配一些动态内存(这是什么Box
的drop
呢,例如),或者做任何事情。因此,编译器从来没有真正强制执行垃圾回收,也不会强制释放未使用的内存。所以我们不能声称 Rust 实现了编译时垃圾收集,即使 Rust 所拥有的很让人想起它。