コンパイラによるヒープ メモリ割り当ての最適化
コンパイラがヒープ メモリ割り当てを最適化できるかどうかという問題は、一部のコンパイラが実行する観察から生じます。この最適化は最適化されますが、他の最適化は行われません。特に、clang 3.0 以降のバージョンでは、コード
int main() { int* mem = new int[100]; return 0; }
内の新しい呼び出しが最適化されますが、g と Visual Studio では最適化されません。このため、そのような最適化が as-if ルールに違反する可能性があるという懸念が生じます。このルールでは、コンパイラーが標準に従っているかのように観察可能な動作を生成する必要があります。
Clang の最適化と As-if ルール
clang の最適化の歴史は、その有効性を明らかにします。 Clang の最適化は N3664 に従っており、このような最適化が可能です。ただし、この決定の因果関係には疑問が残ります。
あるいは、new が例外をスローする可能性があり、監視可能な動作に影響を与える可能性があるため、as-if ルールはそのような最適化を禁止すると解釈することもできます。ただし、clang は、これは実装の詳細であり、例外がスローされないと判断したと主張する可能性があります。
非スロー演算子 New
の引数非スロー バージョンへの呼び出しを最適化して取り除くことも、as-if ルールの下では有効です。ただし、置換グローバル演算子 new が存在する場合、最適化により as-if ルールに違反する可能性があります。 Clang の以前の過剰な最適化 (create() 呼び出しを最適化することさえあった) は、後のバージョンで修正されました。
結論
ヒープ メモリの割り当てを最適化するコンパイラの機能は依然として残っています。これは議論の対象であり、as-if ルールとコードの動作に潜在的な影響を及ぼします。 Clang の最適化は N3664 で許可されていますが、特定の状況では as-if ルールに違反する可能性があるという議論もあります。開発者にとって、これらの微妙な点を認識し、そのような最適化の目に見える結果を考慮することが重要です。
以上がコンパイラは、As-if ルールに違反せずにヒープ メモリ割り当てを最適化できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。