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
相关产品推荐
相关产品推荐

