【问题标题】:Do Rust lifetimes influence the semantics of the compiled program?Rust 生命周期会影响编译程序的语义吗?
【发布时间】:2015-09-02 17:32:13
【问题描述】:

我正在尝试了解 Rust 中的生命周期,并问自己它们是否“只是”一种安全措施(以及在出现错误的情况下传达如何确保安全的一种方式),或者是否存在以下情况生命周期的不同选择实际上会改变程序的运行方式,即生命周期是否会对编译后的程序产生语义差异。

对于“生命周期”,我指的是所有令人讨厌的小 'a'b'static 标记,我们包括让借阅检查员高兴。当然,写

{
    let foo = File::open("foo.txt")?;
} 
foo.write_all(b"bar");

而不是

let foo = File::open("foo.txt")?;
foo.write_all(b"bar");

将在写入发生之前关闭文件描述符,即使我们之后可以访问 foo,但这种作用域和析构函数调用也发生在 C++ 中。

【问题讨论】:

    标签: rust


    【解决方案1】:

    不,生命周期不会以任何方式影响生成的机器代码。归根结底,这都是指向已编译代码的“指针”。

    因为我们是说人类语言的人类,所以我们倾向于将两个不同但相关的概念混为一谈:具体生命周期通用生命周期参数

    所有编程语言都有具体的生命周期。这仅对应于何时释放资源。这就是您的示例所显示的,实际上,C++ 的工作方式与 Rust 在那里的工作方式相同。这通常称为资源获取即初始化 (RAII)。垃圾收集语言也有生命周期,但它们何时结束可能更难确定。

    使 Rust 在这方面整洁的是通用生命周期参数,我们称之为'a'static。这些允许编译器跟踪底层指针,这样程序员就不必担心指针是否会保持足够长的有效时间。这适用于在结构中存储引用并将它们传递给函数。

    【讨论】:

    • 具体生命周期和通用生命周期参数之间的区别真的很有帮助。对两者使用相同的词,我到目前为止阅读的解释也将两个概念混合在一起。
    • @Perseids 老实说,我不确定这些条款是否被接受,但我正在尽我所能做到这一点。 ^_^ 我也试图在模棱两可的时候更好地表达其中一个,但是只说“一生”真是太方便了。
    • 我们可能在这里陷入困境,但澄清所有编程语言都有具体生命周期的陈述可能会很有用。使用垃圾回收时,生命周期实际上可以动态扩展,而 Rust 的生命周期参数所描述的生命周期并非如此,它们只是编译时构造(你必须使用类似Rc 用于动态生命周期延长的指针,就像你在垃圾收集语言中得到的那样)。
    • @B.Striegel:在没有到达Rc 的情况下,String 的缓冲区可以在String 返回时看到其生命周期“延长”。
    猜你喜欢
    • 2022-09-29
    • 1970-01-01
    • 1970-01-01
    • 2013-07-03
    • 2017-08-28
    • 1970-01-01
    • 2014-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多