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);
}
どう書いて良いかイマイチわからんな。。。