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

Rust函数体内的static静态项是否会在每次调用时重新赋值?

问题对应的示例代码

fn main() {
    for _ in 0..10 {
        let _ = get_static_ref();
    }
}

struct SomeStruct {
    value: usize
}

fn get_static_ref() -> &'static SomeStruct {
    static MY_STRUCT: SomeStruct = SomeStruct { value: 1 };
    &MY_STRUCT
}

回答

不会出现重新赋值的情况,你担心的违反非mut静态项不可变规则的场景完全不存在。

具体逻辑很明确:

  • Rust 中所有用static声明的项,不管定义在全局作用域还是函数内部的局部作用域,存储和初始化规则完全一致:固定存放在程序的静态内存区,生命周期和整个程序运行周期一致。
  • 静态项的初始化是纯编译期行为,static MY_STRUCT: SomeStruct = SomeStruct { value: 1 }; 是定义+编译期初始化语句,不是运行时的赋值语句。程序启动加载完成时,这个实例就已经在静态内存区存在了,不会在运行时执行任何初始化相关的操作。
  • 每次调用get_static_ref的时候,只会执行&MY_STRUCT逻辑返回这个静态实例的引用,不会触发任何和初始化、赋值相关的操作。你可以打印每次返回的引用的地址,会发现所有返回值的地址完全相同,足以证明始终是同一个实例。

很多人会把函数内部的static和let声明搞混:如果这里用let声明MY_STRUCT,才会每次调用函数的时候在栈上创建新的实例,两者的底层逻辑完全不同。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 08:06:03