volatile は、その変数を、他のスレッド、他のプロセス、他のハード(メモリマップドI/O)が
勝手に(非同期に)変更するかもしれないときに、意味が出てくる

変数は、変更しなければ、変わらない。
この一見当たり前の条件を前提に、コンパイラは最適化を行う。
この前提が崩れるなら、その旨コンパイラに言っておいてやる必要がある