Rust生命周期会影响编译程序的语义吗?

时间:2015-09-02 17:32:13

标签: rust

我正试着在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 ++中也会发生这种范围和析构函数调用。

1 个答案:

答案 0 :(得分:17)

不,生命周期不会以任何方式影响生成的机器代码。在一天结束时,它只是编译代码的“指针”。

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

所有编程语言都有具体的生命周期。这恰好对应于何时释放资源。这就是你的例子所展示的内容,事实上,C ++的工作原理与Rust相同。这通常称为资源获取初始化(RAII)。垃圾收集的语言也有生命周期,但是当它们结束时它们可能更难确定。

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