【问题标题】:How does Rust's memory management differ from compile-time garbage collection?Rust 的内存管理与编译时垃圾回收有何不同?
【发布时间】:2021-06-12 04:36:18
【问题描述】:

我读过 Rust 的编译器在编译时“插入”内存管理代码,这听起来有点像“编译时垃圾收集”。

这两种想法有什么区别?

我见过What does Rust have instead of a garbage collector?,但那是关于运行时垃圾收集,而不是编译时。

【问题讨论】:

  • 您的问题可能会以基于意见的方式结束,但请查看 RAII,这是 C++ 和 Rust 之间共享的概念,可能最接近“编译时垃圾收集”可能指的是。
  • 取决于你背后的意思。 “垃圾收集”意味着从内存中删除程序中没有活动引用的对象。在 Rust 的情况下,只有当拥有变量超出范围时才应该删除对象。所以 Rust 在编译时或运行时都不需要垃圾回收。它确定性地知道在哪里删除一个对象,这几乎不能称为“集合”,只是从堆/堆栈中删除
  • 我认为链接问题的答案是高质量的并且可以解决您的问题——如果您有一些挥之不去的疑问或者您认为我错误地关闭了这个问题,请edit这个问题澄清如何。这绝对是 Rust 的一个有趣的方面,它与任何其他语言的工作方式都不太相似(C++ 与 RAII 很接近,但默认值不同。)
  • 重复的答案很好地解释了“垃圾收集器”的作用以及 Rust 的作用。术语“编译时垃圾收集”是否足以描述 Rust 所做的事情可能是题外话。
  • 答案可能是肯定的,也可能是否定的,这取决于“编译时垃圾回收”的含义。在那之前,这个问题还不清楚。

标签: rust garbage-collection


【解决方案1】:

编译时垃圾回收通常定义如下:

自动内存管理的一种补充形式是编译时内存管理 (CTGC),其中内存管理决策是在编译时而不是在运行时做出的。编译器确定在程序执行期间创建的变量的生命周期,因此也确定与这些变量相关联的内存。只要编译器可以保证一个变量,或者更准确地说,这个变量在运行时指向的内存资源的一部分,在某个程序指令之外永远不会被访问,那么编译器可以添加指令来释放这些资源该特定指令不会影响结果代码的正确性。

(来自Compile-Time Garbage Collection for the Declarative Language Mercury by Nancy Mazur

Rust 通过使用所有权和借用检查的概念来处理内存。所有权和移动语义描述了哪个变量拥有一个值。借用描述了允许哪些引用访问一个值。这两个概念允许编译器在该值不再可访问时“删除”该值,从而导致程序从 Drop 特征调用 dtop 方法。

但是,编译器本身根本不处理动态分配的内存。它只处理丢弃检查(确定何时调用drop)和插入.drop() 调用。 drop 实现负责确定此时会发生什么,是否释放一些动态内存(例如,Boxdrop 所做的),或者做其他事情。因此,编译器从不真正强制垃圾收集,也不会强制释放未使用的内存。所以我们不能说 Rust 实现了编译时垃圾收集,即使 Rust 所拥有的非常让人联想到它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-25
    • 2012-11-30
    • 1970-01-01
    • 1970-01-01
    • 2012-04-30
    • 2010-09-19
    • 2011-02-28
    • 2011-02-26
    相关资源
    最近更新 更多