代码之家  ›  专栏  ›  技术社区  ›  AurevoirXavier

常量变量和静态变量有什么区别?我应该选择哪一个?

  •  1
  • AurevoirXavier  · 技术社区  · 6 年前

    我是从你那儿知道的 RFC 246 :

    • 声明 . 它们代表一个值,而不是内存地址。这是最常见的事情,一个将达到并将取代 static
    • 静力学 声明 全局变量

    当我试着维护一张桌子的时候,我不知道两者之间到底有什么不同。

    我该选哪一个?

    2 回复  |  直到 4 年前
        1
  •  23
  •   trent oli_obk    4 年前

    易变性

    A const

    struct Foo(u32);
    
    const FOO: Foo = Foo(5);
    
    fn main() {
        FOO = Foo(1); //illegal
        FOO.0 = 2; //illegal
    }
    

    static 变量 是可变的,因此可以修改或重新分配。请注意,编写/修改全局 静止的 变量不安全,因此需要 unsafe 块:

    struct Foo(u32);
    static FOO: Foo = Foo(5);
    static mut FOO_MUT: Foo = Foo(3);
    
    fn main() {
        unsafe {
            FOO = Foo(1); //illegal
            FOO.0 = 2; //illegal
    
            FOO_MUT = Foo(1);
            FOO_MUT.0 = 2;
        }
    }
    

    事件

    编译二进制文件时 常数 “事件”(你用它的地方) 常数 在源代码中)将直接替换为该值。

    s将在二进制文件中有一个专门的部分,它们将被放置在其中(the BSS部分 ,请参见 Where are static variables stored in C and C++? 更多信息)。


    总之,坚持 常数 常数 方法,使用 lazy_static! .

        2
  •  8
  •   Shepmaster Tim Diekmann    6 年前

    如果您的变量不打算更改,那么实际的差别就不大了。

    常量是。。。常量,而静态,而仍然是全局的,可以是可变的。

        3
  •  3
  •   enaut Willem van der Veen    4 年前

    铁锈 static const

    常数 :

    • 它们被内联到每个使用它们的地方,这意味着它们被直接放入二进制文件中。
    • 静止的

    :

    • 它们的值从这个固定地址加载到每个使用它们的地方。
    • 通常运行时较慢,因为我们需要执行从固定地址加载数据的额外指令。但是,这可能会导致较小的可执行文件(仅在频繁使用时),因为它不必将值的多个副本烘焙到可执行文件中。

    例子:

        static CDF: i32 = 100;
        const ABC: i32 = 50;
    
        fn main() {
            println!("{}", CDF); // compiler will put in a load instruction here for the static address
            println!("{}", ABC); // compiler will put the value 50 here directly
        
            // statics can be mutable
            static mut HI: &str = "hi";
        
            // however using mut static is unsafe
            unsafe {
                HI = "HITHERE";
            }
        
            unsafe {
                println!("{}", HI);
            }
        }
    
        4
  •  -4
  •   user603749    5 年前

    static 允许函数控制一个内部值,该值在调用之间被记住,但主应用程序代码不能访问。它类似于类变量,而不是其他语言中的实例变量。C和PHP以及许多其他语言也有这个概念。

    示例:您希望跟踪函数被调用的次数,并有一种重置内部计数器的方法:

    fn counter(reset: bool) -> i32 {
        static mut Count: i32 = 0;
    
        unsafe {
            if reset {
                Count = 0;
            }    
            Count += 1;
            return Count;
        }
    }
    
    println!("{}",counter(true));
    println!("{}",counter(false));
    println!("{}",counter(false));
    //println!("{}", Count); // Illegal