static & const
Static and constant variables are two different ways to create globally-scoped values that cannot be moved or reallocated during the execution of the program.
const
Constant variables are evaluated at compile time and their values are inlined wherever they are used:
const DIGEST_SIZE: usize = 3; const ZERO: Option<u8> = Some(42); fn compute_digest(text: &str) -> [u8; DIGEST_SIZE] { let mut digest = [ZERO.unwrap_or(0); DIGEST_SIZE]; for (idx, &b) in text.as_bytes().iter().enumerate() { digest[idx % DIGEST_SIZE] = digest[idx % DIGEST_SIZE].wrapping_add(b); } digest } fn main() { let digest = compute_digest("Hello"); println!("digest: {digest:?}"); }
According to the Rust RFC Book these are inlined upon use.
Only functions marked const
can be called at compile time to generate const
values. const
functions can however be called at runtime.
static
Static variables will live during the whole execution of the program, and therefore will not move:
static BANNER: &str = "Welcome to RustOS 3.14"; fn main() { println!("{BANNER}"); }
As noted in the Rust RFC Book, these are not inlined upon use and have an actual associated memory location. This is useful for unsafe and embedded code, and the variable lives through the entirety of the program execution. When a globally-scoped value does not have a reason to need object identity, const
is generally preferred.
- Mention that
const
behaves semantically similar to C++'sconstexpr
. static
, on the other hand, is much more similar to aconst
or mutable global variable in C++.static
provides object identity: an address in memory and state as required by types with interior mutability such asMutex<T>
.- It isn't super common that one would need a runtime evaluated constant, but it is helpful and safer than using a static.
Tabella proprietà:
Proprietà | Statico (Static) | Costante |
---|---|---|
Ha un indirizzo in memoria | Si | No (inlined) |
La funzione main “vive” per l’intera durata del programma | Si | No |
Può essere “mutable” (mutabile) | Si (“unsafe”) | No |
Valutato a tempo di compilazione | Si (inizializzato a tempo di compilazione) | Si |
Inlined tutte le volte che viene usato | No | Si |
Ulteriori aspetti da Esplorare
Because static
variables are accessible from any thread, they must be Sync
. Interior mutability is possible through a Mutex
, atomic or similar.
Thread-local data can be created with the macro std::thread_local
.