static

静的変数はプログラムの実行全体を通して存続するため、 移動しません:

// 著作権 2024 Google LLC
// SPDX-License-Identifier: Apache-2.0

static BANNER: &str = "Welcome to RustOS 3.14";

fn main() {
    println!("{BANNER}");
}

Rust RFC Book で述べられているように、これらは使用時にインライン化されず、 実際に対応するメモリ位置を持ちます。これは unsafe コードや組み込みコードで有用であり、 変数はプログラムの実行全体を通して存続します。グローバルスコープの値に オブジェクト同一性を必要とする理由がない場合は、一般に const が 好まれます。

  • static は、C++ の可変グローバル変数に似ています。
  • static はオブジェクト同一性、つまり、Mutex<T> のような内部可変性を持つ型が必要とする メモリ上のアドレスと状態を提供します。

さらに詳しく

static 変数はどのスレッドからでもアクセスできるため、Sync でなければなりません。 内部可変性は、 Mutex、アトミック型、または 同様の仕組みを通じて実現できます。

初回使用時の初期化をサポートする方法として、static で OnceLock を使うのは一般的です。 OnceCellSync ではないため、この文脈では使用できません。

スレッドローカルデータは、マクロ std::thread_local で作成できます。