You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust中const/static里&str与&'static str的区别是什么?

关于Rust中const和static里&str与&'static str的区别

嘿,作为Rust新手碰到生命周期的疑问太正常啦!我来帮你拆解一下你代码里这几种写法的区别~

先看你写的代码:

const CONST_MEEP: &str = "MEEP";
const CONST_LIFETIME_MEEP: &'static str = "MEEP";
static STATIC_MEEP: &'static str = "MEEP";
static STATIC_LIFETIME_MEEP: &str = "MEEP";
fn main() {
    println!("CONST_MEEP is {}", CONST_MEEP);
    println!("CONST_LIFETIME_MEEP is {}", CONST_LIFETIME_MEEP);
    println!("STATIC_MEEP is {}", STATIC_MEEP);
    println!("STATIC_LIFETIME_MEEP is {}", STATIC_LIFETIME_MEEP);
}

运行结果一致是因为这些字符串本质上都是'static生命周期的,但背后的规则有差异:

一、const常量中的&str vs &'static str

对于const定义的常量:

  • 不管你显式写&'static str还是只写&str,编译器都会自动把&str推断为&'static str。
  • 原因很简单:const是编译期就确定的常量,字符串字面量会被硬编码到二进制的只读段中,它的生命周期覆盖整个程序运行期,天然就是'static。所以这两个const变量在语义和运行时表现上完全等价,只是写法不同而已。

二、static变量中的&str vs &'static str

static是全局变量,规则稍微有点不同:

  • 显式写&'static str(比如STATIC_MEEP)是符合static变量要求的——static变量必须拥有'static生命周期,因为它们在程序启动时就分配内存,直到程序结束才释放。
  • 只写&str(比如STATIC_LIFETIME_MEEP)时,编译器同样会自动推断为&'static str,因为你赋值的是字符串字面量,而字符串字面量本身就是'static的。但如果尝试给static的&str赋值一个非'static的引用(比如局部变量的引用),编译器会直接报错,因为局部变量的生命周期远短于程序运行期,不符合static的要求。

额外补充:const和static的本质差异

虽然你的例子里输出一样,但const和static本身的语义不同:

  • const是编译期内联常量:编译器会把const的值内联到每个使用它的地方(当然会做优化避免重复),它没有固定的内存地址。
  • static是全局变量:它在程序内存中有一个固定的地址,所有使用它的地方都是引用这个地址。不过对于字符串字面量来说,不管是const还是static,字符串本身都存在只读段,所以运行时表现差别不大。

内容的提问来源于stack exchange,提问作者user51

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:18:39