Rust使用lazy_static来延迟全局变量的初始化

2022-11-20 15:43:43 浏览数 (1)

场景

在rust中,当我们生成全局static变量的时候,我们可以用以下的代码来声明:

代码语言:javascript复制
static REQUEST_RECV: AtomicUsize  = AtomicUsize::new(0);

Rust编译器的静态求解器会在编译期把这个static变量的值给算出来。但是,现实就是,Rust的静态求解器对于有多级的变量需要new的情况,也就是一个struct里面的另一个变量也需要new出来的情况的处理是很糟糕的。尽管我们肉眼就能看出来这个值是可以在编译期被确定的,但是可惜的是,Rust的编译器会告诉我们,这个不能在编译期求解。

比如下面这个代码:

Word结构体中有一个String类型的成员,于是Rust的编译器认为目标变量的大小是不能确定的。(尽管我们肉眼就能看出这个值是可以在编译期确定的)

引入lazy_static

这个时候,我们需要引入一个crate,叫做lazy_static

这个crate能够将static变量的初始化延迟到运行时,在变量第一次被使用的时候,使用我们声明的表达式来初始化这个变量。这样就解决了问题。

我们只需要在命令行输入

代码语言:javascript复制
cargo add lazy_static

然后将代码文件修改成这样:

即可引入这个crate,编译器也不会报错了。

开销及问题

但是,这样做会引入一定的运行时开销。由于其内部实现用了一个底层的并发原语std::sync::Once,在每次访问该变量时,程序都会执行一次原子指令用于确认静态变量的初始化是否完成。

并且,从以下的lazy_static宏的代码中可以看出,lazy_static匹配的是static ref类型的变量,因此,使用lazy_static初始化的全局变量是不可变的。

转载请注明来源:https://longjin666.cn/?p=1596

0 人点赞