C における引数評価順序のコンパイラの最適化
C 標準では、コンパイラが関数の引数の評価順序を独自の裁量で選択することが許可されています。このため、実際の実装ではこの曖昧さを利用してパフォーマンスを向上させることができるかどうかという疑問が生じます。
ほとんどの場合、コンパイラは引数の評価順序を最適化しません。ただし、アーキテクチャ、呼び出し規約、引数の型が動作に影響を与える可能性があります。 x86 マシンでは、Pascal 呼び出し規約は引数を左から右に評価しますが、C 規約 (__cdecl) は右から左に評価します。プラットフォームに依存しないプログラムは通常、予期せぬ事態を避けるために呼び出し規則を考慮します。
たとえば、従来のコード スニペットでは次のようになります。
int i = 0; foo(i++, i++);
コンパイラーは Pascal 呼び出し規則で i の前に i を評価することがありますが、 __cdecl では逆のことが起こる可能性があります。それにもかかわらず、結果は未定義であり、特定の評価順序に依存することはお勧めできません。
言語標準では引数の評価順序が「未指定」として分類されていることに注意してください。これは、引数の評価順序が明示的に定義されていない、または禁止されていないことを意味します。これにより、実装に依存した動作が可能になり、抽象マシンの非決定性の性質が強調されます。
以上がC コンパイラの最適化は引数の評価順序の曖昧さを悪用しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。