
項目 40:並行処理には std::atomic を、特殊メモリには volatile を用いる
|
289
コンパイラは次のように記述されたものとして処理できます。
auto y = x; // read x x を読み取る
x = 20; // write x x へ書き込む
一体全体どこのどいつがこんな無駄な読み取りや無用の書き込みコードを書くんだと思われると
いけません(専門的には冗長ロード(redundant load)、無意味ストア(dead store)と言う)10。人
間がこのようなコードを直接記述するなどまずありません。少なくとも著者はそう願っています。
しかし、適切に見えるソースコードでも、コンパイラがテンプレートのインスタンス化、インライン
展開、通常行なうさまざまな並べ替えによる最適化の結果、コンパイラが排除するような冗長ロー
ドや無意味ストアの発生は珍しくありません。
この種の最適化が有効なのは、メモリが通常通り振る舞う場合に限られます。「特殊な」メモリに対
しては有効ではありません。特殊メモリの最たるものは恐らくメモリマップ I/O(memory-mapped
I/O)に使用するものでしょう。この場合のメモリは通常の読み取り/書き込み用のものとは異な
り(RAM)、実際には、外部センサ、ディスプレイ、プリンタ、ネットワークポートなど周辺機器と
通信するものです。このような場合を念頭に、冗長な読み取りに見えるコードをもう一度見てみま
しょう。
auto y = x; // read