アトミック変数書き込みにおける最適化の課題
C 標準の "as-if" ルールにより、繰り返しの書き込みの結合が可能になっているにもかかわらず、同じアトミック変数でも、コンパイラは通常これを実行しません
コンパイラ制限の理由
主な懸念は、予期される動作が中断される可能性であることです。プログラマは、アトミック ストアが個別に発生し、潜在的な競合状態の中間値の可視性を維持することを期待しています。ストアの結合は、特に即時更新が必要なプログレス バーのようなシナリオでは、この期待に違反する可能性があります。
標準的な意味
C 標準では、複数の書き込みの折りたたみが許可されています。異なる値が格納されている場合でも、単一のアトミック変数に変換されます。これは、コンパイラが複数の書き込みを結合してパフォーマンスを向上させることができることを示唆しています。ただし、アトミック操作の「as-if」の性質により、実装の決定が行われるため、コンパイラーは予期しない動作を避けるために慎重なアプローチを選択しています。
最適化のケース
潜在的な落とし穴にもかかわらず、アトミック書き込みを最適化する正当な使用例があります。たとえば、ループ内での不必要な参照カウントの操作を減らすと、パフォーマンスが向上する可能性があります。これに対処するために、C ワーキング グループは、アトミック API を拡張して、最適化を明示的に制御できるようにすることを検討しています。
揮発性アトミック変数
揮発性アトミック変数を使用すると、合体を防ぐことができます。の書き込み。 volatile は結合を明示的に禁止しませんが、最適化を制限し、個々の書き込みの一貫性を維持します。ただし、不要なオーバーヘッドが発生する可能性があるため、結合を防ぐ主な手段としては推奨されません。
進行中の議論
C ワーキング グループ内の議論では、結合を有効にする方法を検討しています。コンパイラは、必要に応じてアトミック書き込みを安全に最適化します。これには、最適化が必要な場合と最適化を回避する必要がある場合を示すためのオプトイン構文または注釈の提案が含まれます。
コンセンサスが得られ、標準に実装されるまで、コンパイラーは、へのアトミック書き込みの合体を回避し続ける可能性があります。予測可能性を維持し、プログラマーの期待に準拠します。
以上がC コンパイラがアトミック変数の繰り返し書き込みを最適化しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。