const变量和静态变量之间有什么区别,我应该选择哪个?

时间:2018-10-11 03:11:43

标签: static rust const

我从RFC 246知道这一点:

  
      
  • 常数声明常数值。这些代表一个值,而不是一个内存地址。这是我们目前所知的几乎所有情况下可以达到并取代static的最普遍的东西。
  •   
  • 静态声明全局变量。这些代表一个内存地址。它们将很少使用:主要用例是全局锁,全局原子计数器以及与旧版C库的接口。
  •   

当我尝试维护表格时,我不知道两者之间到底有什么区别。

我应该选择哪个?

4 个答案:

答案 0 :(得分:8)

可变性

Rust中的const变量是不可变的。您既不能重新分配也不能修改它:

struct Foo(u32);

const FOO: Foo = Foo(5);

fn main() {
    FOO = Foo(1); //illegal
    FOO.0 = 2; //illegal
}

一个static变量 是可变的,因此可以修改或重新分配。请注意,编写/修改全局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;
    }
}

发生次数

编译二进制文件时,所有const“出现次数”(在源代码中使用const的地方)都将直接由该值替换。

static在二进制文件中将放置一个专用部分( BSS部分,有关详细信息,请参见Where are static variables stored in C and C++?)。


总而言之,请尽可能坚持使用const。如果不可能,因为稍后需要在程序中使用非const方法初始化变量,请使用lazy_static!

答案 1 :(得分:4)

static vs const

const

  • 内存中没有固定地址
  • 它们被内联到每个使用它们的地方,这意味着它们被直接放入使用它们的地方的二进制文件中。
  • 通常运行速度更快,但可执行文件更大,因为它不必查找 static 之类的地址

static

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

示例:

    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);
        }
    }

答案 2 :(得分:3)

如果您不希望更改变量,则实际差异不大。

常量在编译时会内联,这意味着它们会被复制到所使用的每个位置,因此通常效率更高,而静态变量是指内存中的唯一位置,更像是全局变量。

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

答案 3 :(得分:-1)

<!DOCTYPE html> <html> <head> <title>practise</title> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" type="text/css" href="style.css"> </head> <body> <div class="wrapper"> <section id="head"> <div class="container"> <header>Holiday <span>resort</span></header> <ul> <li><a href="index.html">Home</a></li> <li><a href="index.html">About Us</a></li> <li><a href="index.html">Services</a></li> </ul> </div> </section> </div> </body> </html>的主要目的是允许函数控制内部值,该内部值可在调用之间记住,但不能由主应用程序代码访问。与其他语言中的实例变量不同,它类似于类变量。 C和PHP以及许多其他语言也有这个概念。

示例:您想跟踪一个函数被调用多少次,并有一种复位内部计数器的方法:

function showJahresZahlen() {
    for (var i = 0; i < data.length - 0; i++) {
      xPos = map(data[i].longitude, (0 - 180), 180, 0, paperWidth);
      yPos = paperHeight - map(data[i].latitude, (0 - 90), 90, 0, paperHeight);


        if (data[i].lastEruption < 100) {
          var circleColor = "blue"
        } else if (data[i].lastEruption > 1000 && data.lastEruption < 1500) {
          var circleColor = "red"
        } else {
          var circleColor = "orange"
        }


      data[i].circle.animate({

        cx: xPos,
        cy: yPos,
        fill: circleColor,
      }, 2000);
    };