C++ volatile 書いて覚えるための初心者自己中記事
メモリ上にある値を使って計算を行うにはメモリからCPUへデータが読み込まれる。
CPUにもメモリとは別にデータを置いておく場所があり、この作業領域をレジスタという。レジスタは非常に高速なアクセス。CPUとレジスタの話?
メモリからレジスタはそれなり。
なのでメモリ~レジスタの行き来をなるべく少なくしたい。
void Hoge() { int n = 1; if (n) { cout << n << endl; } };
この関数内の変数n は値が変化していない。
さらにif文は必ずtrueになる。
そのため
void Hoge() { cout << 1 << endl; };
コンパイラはこのように最適化をしてしまう場合がある。
変数n そのものがなくなってしまった。
void Hoge() { int n = rand() % 2; if (n) { cout << n << endl; };
この場合はn は消されない。
このn の値をずっとレジスタを使って扱えばメモリへのアクセスが必要なくなります。???
とにかく、最適化によって変数が削除されたり、数値の値がメモリ上に置かれない状態になったりすることがある。
なんかわからないけど、それが困る状況があるらしい。
そのために限定的に最適化をキャンセルさせる方法があって、それが
volatile
これを変数宣言の先頭につけるだけ。
この変数を使用する個所では必ずメモリにアクセスするようになる。
volatile はconstの同類。
const外すのがconst_cast
そのままvolatile 外すのも const_cast
volatile がよく使われるのはマルチスレッドプログラミングだそう。
全然知らない。
マルチコアCPUの話かな?
とにかく処理が複数ってことで、スレッド1とスレッド2の両方から使われる変数とかで必要らしい。
スレッド1では変化なしだけどスレッド2で変更される可能性があるとかを考慮しないで最適化してしまうかもしれない。ってことであってるかな。
また、メモリマップド I / O というメモリへのアクセスが外部機器への入出力に相当するような機能があって、最適化でメモリへのアクセスが省略させたりすると機能しなくなったり、アクセスの順番が変わってしまったりしても操作準が変わってしまう結果になったりする。
ここまで。