RUST 全局变量
rust 全局变量
编译期初始化的全局变量
静态常量
- 在编译期初始化,所以其赋值只能是表达式/数学表达式,即在编译期就能计算出的值;
- 使用
const
修饰; - 类型不能省略;
- 常量名全部大写;
- 声明周期贯穿整个程序;
- 编译器会尽可能内联到代码;
- 在其作用域内不允许重复定义;
静态变量
- 使用
static
来修饰; - 必须使用
unsafe
语句才能访问和修改static
变量; - 在同一线程内/不在乎数据准确性的情况下,才应该使用全局静态变量;
- 定义静态变量时必须赋值为在编译期就可以计算出的值(常量表达式/数学表达式),不能是运行时才能计算出的值;
- 整个程序中静态变量只有一个实例,所有应用都会只想同一个地址;
- 存储在静态变量的值必须要实现
Sync trait
;
原子类型的静态变量
- 可以实现多线程安全,不需要使用
unsafe
语句;
运行期初始化的全局变量
lazy_static
- 用于初始化静态变量;
- 可以在运行期进行静态变量初始化;
- 有一定的性能损失:内部使用了一个
std::sync::once
并发原语,每次访问该变量时都会执行一次原子命令用于确认该变量是否被初始化; lazy_static
宏匹配的是static ref
,所以定义的静态变量都是不可变引用;- 可以根据场景对全局变量进行动态初始化;
Box::leak
- 可以将一个变量从内存中泄露,然后将其变成
'static
生命周期; - 可以用于将局部变量赋值给全局变量;
OnceCell & OnceLock
- 前者用于单线程,后者用于多线程;
- 用来存储堆上的信息,并且具有最多只赋值一次的特性;