Rust生命周期是否影响编译程序的语义?

12
我正在尝试理解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个回答

17
不,生命周期不会以任何方式影响生成的机器代码。归根结底,它们只是对编译代码的“指针”。
因为我们是使用人类语言交流的人类,我们倾向于将两个不同但相关的概念混在一起:具体生命周期和通用生命周期参数。
所有编程语言都有具体生命周期。这仅对应于资源何时释放。你的示例展示了这一点,实际上,C++在那方面与Rust的工作方式相同。这通常被称为资源获取即初始化(RAII)。垃圾回收语言也有生命周期,但往往很难确定其结束时间。
Rust在这个领域的优势在于通用生命周期参数,即我们所知道的'a或'static'。这些允许编译器跟踪基础指针,使程序员不必担心指针是否足够长时间保持有效。这适用于在结构体中存储引用并将其传递给和从函数中传递引用。

具体生命周期和泛型生命周期参数之间的区别非常有帮助。使用相同的单词来描述两者,我所阅读到的解释也混淆了这两个概念。 - Perseids
@Perseids 说实话,我不确定这些是否是被接受的术语,但我正在尽力让它们成为如此。^_^ 我也在努力在含糊时说清楚其中一个,但只说“lifetime”真的很方便。 - Shepmaster
4
可能会有一些细节需要讨论,但是澄清所有编程语言都具有具体生命周期这一说法可能很有用。当使用垃圾回收时,生命周期实际上可以动态扩展,这与Rust生命周期参数所描述的生命周期不同,后者仅为编译时结构(您必须使用像Rc指针这样的东西来进行动态生命周期扩展,就像在垃圾回收语言中一样)。 - B. Striegel
1
@B.Striegel:在不使用Rc的情况下,当返回String时,其缓冲区可以看作是其生命周期被“延长”了。 - Matthieu M.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接