Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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.

This slide should take about 5 minutes.
  • static похож на изменяемые глобальные переменные в C++.
  • static обеспечивает идентичность объекта: адрес в памяти и состояние, которые нужны типам с внутренней изменяемостью, например Mutex<T>.

Для дальнейшего изучения

Поскольку к статическим переменным может обращаться любой поток, они должны реализовывать Sync. Внутреннюю изменяемость можно обеспечить через Mutex, атомарные типы или аналогичные средства.

Часто в static используют OnceLock, чтобы поддержать инициализацию при первом использовании. OnceCell не реализует Sync, поэтому в этом контексте его использовать нельзя.

Данные, локальные для потока, можно создать с помощью макроса std::thread_local.