質問: 1; } ``` 簡単な関数の例なのですが、 > > volatile宣言がされている場合、コンパイラはそのデータが置かれたメモリに対する読み書きの順序を変更できない。しかし、これらの読み書きと、他のメモリに対する読み書きとの順序を変更してもよい。 > > したがって、コンパイラはこのループをbuffer_readyへの書き込みの後に移動することができる。これはプログラマの意図に反する。 > > > 今回の場合は、buffer_readyが入れ替わっても問題無さそうですが、複雑な関数になると問題になってくるはずです。 そうすると、bufferの方にもvolatileを付ける羽目になり、**volatileがどんどん増えていきます。** buffer_init()そのものを最適化抑止させる機能があると便利ではないでしょうか? ラムダ式って何が便利なのです?? 以前の質問で、main()を内をさらに細かい関数単位で分割できる・・・と言ったんですが、すると関数の中もラムダ式を使って細かく最適化抑止を制御できるのではないか?(ラムダ関数を最適化抑止する) という想像ができます。 ラムダ式の利便性が向上しそうです。 __________________________ まぁ、私の妄想はどうでもいいんですけど・・・関数全体に対して最適化抑止機能が付いているのはどうかなぁ??と思っただけの話なのです。 ここでの疑問は「**どうやって、volatile修飾が必要な箇所を見つければ良いんでしょうか??**」という疑問です。 パターンがあるなら、是非教えてください。
回答: パターンというか私ならここでvolatileを使うというケースです。 * ポーリング待ち用の変数にはつける。 * I/Oにアクセスするためのポインタ変数にはつける。 最近のCPUはOutOfOrder実行が普通なので最適化の有無に関係なく変数にアクセスする順番が守られない可能性があります。 その場合はメモリフェンス命令によって次に実行する命令を待たせたりするのですが、マルチコアCPUをターゲットにした環境の場合はミューテックスやロックの関数にその機構が実装されてるのかもしれませんね。