C でのステートメントの順序の強制
質問:
の再順序付けを防ぐにはどうすればよいですか? C コードのステートメント (最適化を行った場合でも)有効ですか?
答え:
一般的な前提にもかかわらず、C は、特に最適化下では、本質的にステートメントの順序付けを強制しません。最適化されたコードでは特定のステートメントが順序どおりに表示されない場合があり、時間に敏感な操作などのシナリオでは問題となる可能性があります。
解決策:
基本的に、操作厳密な順序付けを実現するための加算などの基本的な操作のセマンティクスは実現できません。コンパイラとハードウェア設計の最適化は、これらの操作には観察可能なタイミング特性がないという前提を前提としています。
ただし、マイクロベンチマーク用の効果的な手法が登場しています。
不透明なデータ操作:
ライブラリ サポート:
template <class T> __attribute__((always_inline)) inline void DoNotOptimize(const T &value) { asm volatile("" : "+m"(const_cast<T &&>(value))); }
コンパイラ ディレクティブ:
注:
C標準委員会は、ステートメントの順序の強制をさらに容易にするために、DoNotOptimize などの API の標準化を検討しています。
以上が最適化された C コードでステートメントの並べ替えを防ぐにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。