【问题标题】:Are Rust closures stack-allocated or heap-allocated by default?默认情况下,Rust 闭包是堆栈分配的还是堆分配的?
【发布时间】:2021-05-18 11:47:22
【问题描述】:

我知道 Rust 默认在堆栈上分配,但论文 Ownership is Theft 说 Rust 闭包通常是动态分配的(我认为这是“在堆上”的意思)。

【问题讨论】:

  • 那篇论文发表于 2015 年 10 月。无装箱闭包于当年 1 月首次实施。我看不懂这篇论文,但很可能它的大部分内容是基于 1.0 之前的 Rust 版本编写的,默认情况下,闭包被装箱(相当于今天的Box<dyn Fn...>)当您阅读研究报告时,通常必须牢记日期。
  • 我在研究时发现了这些信息 - 但我想仔细检查一下,因为我找不到任何 Rust 文档说闭包在默认情况下肯定是堆栈分配的。 (当然这并不意味着它不存在。)不过还是谢谢你!
  • 如果你对历史感兴趣,release notes for 1.0.0-alpha 会说:“闭包已经被 completely redesigned 实现为特征,现在可以用作泛型类型边界,因此可以单态化和内联,或者通过一个不透明的指针(装箱),就像在旧系统中一样。新系统通常被称为“未装箱”的闭包。”
  • 这正是我一直在寻找的东西!非常感谢

标签: rust heap-memory stack-memory


【解决方案1】:

默认情况下它们位于堆栈上。这可以通过证明在没有分配器的环境中允许闭包来证明,例如在 libcore 中。来自core::Option::map

pub fn map<U, F: FnOnce(T) -> U>(self, f: F) -> Option<U>

作为trentcl notes:

如果您对历史感兴趣,release notes for 1.0.0-alpha 说:

闭包已被completely redesigned 实现为特征,现在可以用作泛型类型边界,因此可以单态化和内联,或者像旧系统中那样通过不透明指针(装箱)。新系统通常被称为“未装箱”的闭包。

另见:

【讨论】:

  • 感谢您的快速回答!你有任何指向 Rust 文档的链接吗? (我正在为大学课程写一篇论文。)
  • 感谢您提供额外的示例作为证据!
猜你喜欢
  • 1970-01-01
  • 2012-07-29
  • 2019-10-25
  • 1970-01-01
  • 2015-07-21
  • 2020-10-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多