Visual C++ 以外、volatile の扱いがダメダメな件について

昨日、g++ での volatile の扱いが微妙に変 というエントリーを書いたわけですが、その後 volatile 修飾対応を進めていると g++ 以外のコンパイラについても volatile まわりの問題が噴出し、付き合ってられないので volatile 修飾対応は断念しました。コンパイラを判別して問題ないコンパイラでは volatile 修飾に対応するなどいった手もあるわけですが、現在、私は簡潔主義を採用しているので、この件に関しては「volatile 修飾対応の必要があれば外側で対応(キャスト)してくれ」ということにしようと思います。

それにしても多くのコンパイラで、hoge_type::method(); と hoge_type::method() volatile; の区別すらろくにできないのには驚きました(当然、どのコンパイラでもこれが volatile ではなく const であれば問題ありません)。

Visual C++ に関しては volatile まわりの対応は優秀で、VC6 でも問題に遭遇しないで済みました。

ポータビリティを意識したコードではあまり volatile 修飾を多用するわけにはいかないようですが、コンパイラやそのバージョンを大幅に限定しても構わず volatile 修飾対応を考えている方にピンポイントでアドバイスを残しておきますと、const 修飾と同じく volatile 修飾された引数及びメンバ関数は volatile 修飾されていない引数や this にも有効なので volatile 修飾の有り/無しで処理内容が変わらない場合は、volatile 修飾版だけ記述しておけばこと足ります。しかし、volatile 修飾版は当然のことながらオプティマイズが抑止されてしまいますので、処理内容が全く同じであっても非 volatile 修飾版と volatile 修飾版の両方を記述しておくことをオススメします。また、引数や関数のどの部分に volatile 修飾を施すかについていくつか組み合わせが考えられることが多くあると思いますが、その組み合わせのオーバーロードを全部定義しているとキリがないと思いますので volatile 修飾版は引数と関数の全てに volatile 修飾を施したバージョンをひとつだけ定義するのが現実的だと思います。