これらの場合の「メモリ モデルの欠如」は、C++11 メモリ モデルが公開される前にオプティマイザーが作成され、無効な最適化を実行する可能性があることを意味していると思います。メモリ モデルに対して最適化を検証することは非常に困難で時間がかかるため、clang/gcc チームがまだそれを完了していないことは大きな驚きではありません。
メモリ モデルのサポートがないということは、std::atomic を使用する正当な C++11 プログラムが seq の一貫性を保っていないことを意味しますか?
はい、可能性があります。さらに悪いことに、コンパイラは (C++11 標準に従って) 競合のないプログラムにデータ競合を導入する可能性があります。たとえば、投機的な書き込みを導入することによってです。
たとえば、この最適化を実行するために使用されるいくつかの C++ コンパイラは次のとおりです。
for (p = q; p = p -> next; ++p) {
if (p -> data > 0) ++count;
}
次のように最適化できます。
register int r1 = count;
for (p = q; p = p -> next; ++p) {
if (p -> data > 0) ++r1;
}
count = r1;
すべてp->data
が負でない場合、元のソース コードは に書き込みませんcount
が、最適化されたコードは書き込みます。これにより、競合のないプログラムでデータ競合が発生する可能性があるため、C++11 仕様ではそのような最適化は許可されていません。既存のコンパイラは、すべての最適化を検証 (および必要に応じて調整) する必要があります。
詳細については、同時実行メモリ モデル コンパイラの結果を参照してください。