В чем разница между константной переменной и статической переменной и какую мне выбрать? - PullRequest
0 голосов
/ 11 октября 2018

Я знаю это из RFC 246 :

  • констант объявляют значения констант .Они представляют значение, а не адрес памяти.Это самая распространенная вещь, к которой можно обратиться и которая заменит static, как мы знаем это сегодня почти во всех случаях.
  • statics объявляет глобальные переменные .Они представляют адрес памяти.Они будут использоваться редко: основными вариантами использования являются глобальные блокировки, глобальные атомные счетчики и взаимодействие с унаследованными библиотеками C.

Я не знаю, что на самом деле отличается между ними, когдаЯ пытаюсь вести таблицу.

Какой из них выбрать?

Ответы [ 3 ]

0 голосов
/ 11 октября 2018

Изменчивость

Переменная const в Rust неизменна.Вы не можете ни переназначить, ни изменить его:

struct Foo(u32);

const FOO: Foo = Foo(5);

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

A 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 s будет иметь выделенный раздел в вашем двоичном файле, куда они будут помещены (раздел BSS , см. Где хранятся статические переменные в C и C ++? для получения дополнительной информации).


В общем, придерживайтесь const, когда это возможно.Когда это невозможно, потому что вам нужно позже инициализировать переменную в программе с не const методами, используйте lazy_static!.

0 голосов
/ 03 июля 2019

Основная цель 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
0 голосов
/ 11 октября 2018

Практически нет большой разницы, если ваша переменная не предназначена для изменения.

Константы встраиваются при компиляции, что означает, что они копируются в каждое используемое место и, следовательно, обычно более эффективны, в то время как статика ссылается на уникальное местоположение в памяти и больше похожа на глобальные переменные.

Константы являются ... константами, в то время как статика, хотя и является глобальной, может быть изменяемой.

...