我正在学习铁 rust .我读了一篇关于static https://practice.rs/lifetime/static.html的文章

其主要思想是明确的--静态生存期意味着引用是有效的,直到程序结束.

fn main(){
    let message;
    {   
        let words = get_message();
        message = words;
    } 
    println!("message: {}", message);
}
 
fn get_message() -> &'static str {
    "hello"
}

但是,生产代码中的静态有什么好处呢?

你能提供静态用法的真实(生产代码)的例子吗?

推荐答案

静态生命周期的主要yield 是:

  1. 保证引用将始终有效,这在例如多线程上下文中有时是有用的.
  2. 允许编译器/链接器将数据放入可执行文件的data segment位(与C/C++中的文字和全局/静态变量相同),其加载非常快并且使用单独的寻址空间(这对于32位体系 struct 更为重要,其中即使使用地址扩展,每个进程通常也被限制为几GB的虚拟内存),
  3. 确保内存分配和取消分配(除了堆栈分配之外)不会在运行时发生,这对于嵌入式应用程序或需要高度确定内存使用的其他情况可能很重要.

1请注意,将'static对象Mutations 为unsafe,但可以使用Cell<T>或其他方法解决此问题.

据我所知,静态生命周期 的两个最常见的例子是:

  1. 如您的示例所示,字符串文字!所有字符串文字自动为'static,并存储在数据段中.
  2. lazy_static crate 允许灵活地初始化静态对象,有thousands of other crates人使用,其中许多出现在生产应用程序和框架中,包括Tower、Tokio,甚至Cargo.

Rust相关问答推荐

为什么迭代器上的`. map(...)`的返回类型如此复杂?

如何找到一个数字在二维数组中的位置(S)?

在泛型 struct 的字段声明中访问关联的Conant

展开枚举变量并返回所属值或引用

无法理解铁 rust &S错误处理

在Rust中有没有办法在没有UB的情况下在指针和U64之间进行转换?

类型批注需要静态生存期

在Rust中克隆源自INTO_ITER()的迭代器的成本?

为什么不';t(&;mut-iter).take(n)取得iter的所有权?

sha256 摘要仅适用于 &*

将引用移动到线程中

bcrypt 有长度限制吗?

返回迭代器的特征

是否有适当的方法在参考 1D 中转换 2D 数组

将 (T, ()) 转换为 T 安全吗?

类型组的通用枚举

你能用 Rust 和 winapi 制作 Windows 桌面应用程序吗?

如何在 Rust 的内置函数上实现特征?

在特征中返回一个 Self 类型的值

如何阅读 HttpRequest 主体