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 を使うのは一般的です。 OnceCell は Sync ではないため、この文脈では使用できません。
スレッドローカルデータは、マクロ std::thread_local で作成できます。