Visual C++ 2005 以降、Microsoft はvolatile
、C++ 標準で必要とされていない型へのアクセスに対して追加の順序保証を行いました。
C++ 標準には、これらの保証を実際に禁止するものはありますか? Microsoft のドキュメントはそう考えているようです。
Microsoft によって実装された順序付けが標準で許可されているかどうかをお知らせください。また、このバグ レポートに投票してください。
Visual C++ 2005 以降、Microsoft はvolatile
、C++ 標準で必要とされていない型へのアクセスに対して追加の順序保証を行いました。
C++ 標準には、これらの保証を実際に禁止するものはありますか? Microsoft のドキュメントはそう考えているようです。
Microsoft によって実装された順序付けが標準で許可されているかどうかをお知らせください。また、このバグ レポートに投票してください。
実装は、標準で定められた要件を満たしている限り、必要以上のことを行うことができます。オブジェクトにリリース/取得セマンティクスを追加するvolatile
ことは、間違いなく範囲内です。セマンティクスを変更することに C++ 委員会が関心を持っているとは思いません (ポートランドで C++ について Herb と議論する新しい週が始まったばかりで、現在、会議の開催方法について話し合っています)。
この規格では、揮発性オブジェクトへのアクセスは、抽象マシンのルールに従って厳密に評価される必要があります。つまり、大まかに「最適化しない」ことを意味しますが、それ以上ではありません。たとえば、コンパイラは、レジスタに値をキャッシュしたり、共通部分式除去を実行したりすることはできません。それはあなたがそれを言うことを正確に行わなければなりません。
したがって、すべての標準的なケアについて、セマンティクスvolatile
がmemory_order_relaxed
あります(異なるものは何も指定されていません)。もちろん、これは、より厳密なものを実装することが許可されていないという意味ではありません。
Microsoftコンパイラは常に(2005年からBen Voigtが指摘しているように)volatile
取得/解放として扱われているため、多くの人が「volatile == threadsafe」と見なし、その結果、多くの記事がこれを「volatileは役に立たない!」に変えています。そして「揮発性は悪」。
MSがISO実装の使用を推奨する理由として考えられるのは、これにより、コンパイラが他のすべてのコンパイラと同じように動作するようになり、厄介な驚きがなくなるためです。