static
Статические переменные существуют на протяжении всего выполнения программы и поэтому не перемещаются:
// Copyright 2024 Google LLC
// SPDX-License-Identifier: Apache-2.0
static BANNER: &str = "Добро пожаловать в RustOS 3.14";
fn main() {
println!("{BANNER}");
}
Как отмечено в Rust RFC Book, при использовании они не подставляются, а имеют реальное связанное место в памяти. Это полезно для небезопасного и встраиваемого кода, а переменная живёт всё время выполнения программы. Если глобально определённому значению не нужна идентичность объекта, обычно предпочтительнее const.
staticпохож на изменяемые глобальные переменные в C++.staticобеспечивает идентичность объекта: адрес в памяти и состояние, которые нужны типам с внутренней изменяемостью, напримерMutex<T>.
Для дальнейшего изучения
Поскольку к статическим переменным может обращаться любой поток, они должны реализовывать Sync. Внутреннюю изменяемость можно обеспечить через Mutex, атомарные типы или аналогичные средства.
Часто в static используют OnceLock, чтобы поддержать инициализацию при первом использовании. OnceCell не реализует Sync, поэтому в этом контексте его использовать нельзя.
Данные, локальные для потока, можно создать с помощью макроса std::thread_local.