结论:const 是编译期常量,每次使用处内联展开,没有固定内存地址;static 是有固定地址的全局变量,整个程序只有一份,所有引用指向同一内存。
展开:区别落到三点:1)内存:const N: i32 = 5 像宏一样替换到每个使用点,两个 &N 可能地址不同;static N: i32 = 5 占据 data/rodata 段一个位置。2)可变性:const 永远不可变;static mut 可写但访问必须 unsafe(多线程下是数据竞争温床,Rust 2024 起更改为 static mut 引用直接报错),线程安全的可写全局态应使用 Mutex<T>、AtomicUsize 配合 OnceLock/LazyLock。3)初始化时机:两者都要求编译期可求值的初始化表达式,运行时才能算出的全局值(如正则、数据库连接池)用 OnceLock::get_or_init 或 lazy_static。易错点:大数组用 const 会在每个使用点复制一份,应改 static。
const MAX: usize = 1024; // 内联,无地址
static NAME: &str = "svc"; // 唯一实例
static COUNTER: std::sync::atomic::AtomicUsize =
std::sync::atomic::AtomicUsize::new(0);
static POOL: std::sync::OnceLock<Vec<u8>> = std::sync::OnceLock::new();
追问方向:内联 static(static 里的字符串字面量为何是 'static)、OnceLock 与 lazy_static 的性能差异。