【Rust】静的変数(static)

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);
}

どう書いて良いかイマイチわからんな。。。