微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

使用静态变量的示例:

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! var是延迟(按需)初始化的。这意味着每次尝试读取静态变量时,都会进行检查以确保该变量已初始化或相应地对其进行了初始化。

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

还有conststatic关键字。 如果使用const关键字,则在使用const的位置内联该值(在C ++中请考虑#define)。 对于static关键字,二进制中仅内联了1个变量实例。引用static变量就像是指向二进制文件一部分的指针。

在可能的情况下,这两个选项都比使用lazy_static!更快。

此外,通过编译器优化,可能会内联函数。然后,编译器可以优化传递的参数。这样就根本没有传递参数的开销。

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。