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

Per*_*ids 12 rust

我正试着在Rust中度过生命,并问自己,他们是否"只是"一种安全措施(以及在错误的情况下沟通如何确保安全性的方式)或者是否存在不同选择的情况生命周期实际上改变了程序的运行方式,即生命周期是否与编译的程序产生语义差异.

并以"寿命"我指的是所有讨厌的小'a,'b,'static标志我们包括使借检查开心.当然,写作

{
    let foo = File::open("foo.txt")?;
} 
foo.write_all(b"bar");
Run Code Online (Sandbox Code Playgroud)

代替

let foo = File::open("foo.txt")?;
foo.write_all(b"bar");
Run Code Online (Sandbox Code Playgroud)

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

She*_*ter 17

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

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

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

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

  • 我们可能会在这里进入杂草,但澄清所有编程语言具有生命周期的陈述可能是有用的.当使用垃圾收集时,生命周期实际上可以*动态*扩展,而Rust的生命周期参数描述的生命周期则不是这样,生命周期参数只是编译时结构(你必须使用类似`Rc`指针的东西)像垃圾收集语言一样,动态生命周期扩展. (4认同)