staticは静的変数を定義する。値は変動しても良いが、変数の位置が固定で、複数スレッドから共通に参照することができる。
static mut COUNTER: u32 = 0; fn main(){ unsafe { println!("{}", COUNTER); COUNTER += 1; println!("{}", COUNTER); } }
安全に読み書きするには、アトミック性を保証する参照・変更を用いる。
use std::sync::atomic::{self, AtomicU32, Ordering}; static COUNTER: AtomicU32 = AtomicU32::new(0); fn count_up() {COUNTER.fetch_add(1, atomic::Ordering::SeqCst);} fn get_count()-> u32 { return COUNTER.load(Ordering::SeqCst); } fn main(){ unsafe { println!("{}", get_count()); count_up(); println!("{}", get_count()); } }
### C++
グローバル変数
static int a = 10; extern int b; int main(void) { }
静的メンバ変数
#include <iostream> static int num = 0; struct Sample { void CountUp() { num++; std::cout << "num: " << num << std::endl; } }; int main(void) { Sample instance1; instance1.CountUp(); Sample instance2; instance2.CountUp(); }
C++
#include <iostream> static int num = 0; struct Sample { void CountUp() { num++; std::cout << "num: " << num << std::endl; } }; int main(void) { Sample instance1; instance1.CountUp(); Sample instance2; instance2.CountUp(); }
static mut num: i32 = 0; struct Sample { } trait Count {fn CountUp(n: i32);} impl Count for Sample { fn CountUp(n: i32) { n = n + 1; println!("{}", n); } } fn main(){ let s1 = Sample {}; s1.CountUp(num); let s2 = Sample {}; s2.CountUp(num); }
どう書いて良いかイマイチわからんな。。。