質問:
コンパイラはなぜマージを控えるのか同じ値の連続した書き込みを単一のアトミックにマージする変数?
答え:
C 11 / C 14 標準では複数のストアを 1 つに折りたたむことが許可されていますが、次の理由によりコンパイラはこの最適化を実装しません。
1.プログレスバーの問題:
シンクおよびフォールディングループストアにより、プログレスバーが増分的に表示されず、最後に 100% にジャンプするまでゼロでスタックして表示される場合があります。
2.最小驚きの原則:
プログラマは、各アトミック ストア ステートメントが最適化されるのではなく、個別のメモリ操作を持つことを期待します。これにより、予期しない動作が回避されます。
3.限定された使用例:
コンパイラーは、不必要なshared_ptr参照カウント操作の削減など、この最適化が有益となるシナリオはまれであると判断しました。
1. As-If ルール:
as-if ルールを使用すると、ソース コードに別の指示がある場合でも、コンパイラがメモリ操作の順序を決定できます。これにより、プログラムの動作を変更する可能性のある内部最適化が可能になります。
1. API 拡張機能:
C ワーキング グループ内の議論は、std::atomic API を拡張して最適化動作の制御を提供し、コンパイラーが適切な場合に最適化できるようにするために進行中です。
2. Volatile Atomic 変数:
Volatile Atomic
以上がコンパイラはなぜ連続した冗長な `std::atomic` 書き込みを最適化しないのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。