Rust 中有什么更好的地方:定义一个静态变量以全局访问它或通过函数参数传递一个非静态变量?

What is better in Rust: defining a static variable to access it globally or passing a non-static variable through function arguments?

如果一个变量在文件中的多个函数中使用,是否将其定义为静态变量而不是通过函数参数传递非静态变量更好?这对性能有影响吗?

一个使用静态变量的例子:

lazy_static! {
    static ref FOO: Foo = {
        Foo::new()
    };
}

fn main() {
    do_foo();
    do_another_foo();
}

fn do_foo() {
    FOO.bar();
    // ...
}

fn do_another_foo() {
    let name = FOO.name();
    // ...
}

一个使用普通变量的例子:

fn main() {
    let foo = Foo::new();
    do_foo(&foo);
    do_another_foo(&foo);
}

fn do_foo(foo: &Foo) {
    foo.bar();
    // ...
}

fn do_another_foo(foo: &Foo) {
    let name = foo.name();
    // ...
}

如果您使用lazy_static!,每次访问变量时都会有相当多的开销。顾名思义,lazy_static! 变量是延迟初始化的(按需)。这意味着每次尝试读取静态变量时,都会进行检查以确保变量已初始化或相应地对其进行初始化。

lazy_static! 可能比通过函数参数传递变量慢很多。

还有conststatic关键字。 在 const 关键字的情况下,值在使用 const 的地方内联(想想 C++ 中的 #define)。 在 static 关键字的情况下,二进制文件中只有 1 个内联变量实例。引用 static 变量就像指向二进制文件的一部分的指针。

如果可能,这两个选项都比使用 lazy_static! 更快。

此外,通过编译器优化,函数可能会被内联。然后编译器可以优化参数传递。然后根本不会有任何传递参数的开销。

我猜想函数参数与 const/static 差不多。

也就是说,通常更喜欢通过函数参数传递状态而不是使用全局状态。全局状态往往会导致代码混乱,从而导致性能不佳。