volatile修飾子
C言語における、コンパイラの最適化を抑制したメモリアクセスを実現するための修飾子。 Rust言語には、read_volatileとwrite_volatile関数がある。 なぜ必要?
メモリアクセスを行う場合、意図したメモリアクセスが行われなくなることがある。 メモリアクセスはレジスタアクセスに比べて低速なので、レジスタに値をコピーしてから参照する、など
これはたいていうまく動作するが、メモリの値を監視する場合などはバグの温床となる。
そのとき、volatile修飾子を使う。
volatile修飾子を指定することで、メモリアクセスの最適化を抑制できる。 例
volatile修飾子を使わない場合
code: 2_2_2_volatile.c
void wait_while_0(int *p) {
while (*p == 0) {}
}
このコードは、*pを監視し、値が0の間ループする、という意図で書かれたもの
しかし、コンパイラの最適化によって、*pへのアクセスが省略される場合がある
これは意図した動作ではないので、以下のようにvolatile修飾子を使う必要がある
volatile修飾子を使う場合
code: 2_2_2_volatile.c
void wait_while_0(volatile int *p) {
while (*p == 0) {}
}
こうすると、コンパイラによる最適化が抑制され、ループごとにメモリアクセスがなされる