ヒープ メモリ割り当てに関するオプティマイザの視点
C の領域では、コンパイラはヒープ メモリ割り当てを最適化できるか?という疑問が生じます。この興味深いトピックについて詳しく見てみましょう。
次のコード スニペットを考えてみましょう:
int main() { int* mem = new int[100]; return 0; }
コンパイラには新しい呼び出しを削除する自由がありますか?私たちの調査によると、g と Visual Studio はこの最適化を避けていますが、clang はこの最適化を受け入れています。この相違は次のような疑問を引き起こします: 新しいシステム コールは基礎となるシステム コールに依存しており、コンパイラの最適化が非現実的かつ許容できないものになっているのではありませんか?
コンパイラの正当性
この難問を明確にするために、次のようにします。コンパイラがメモリ割り当てを最適化できるようにする提案である N3664 の役割を認識する必要があります。ただし、この最適化は N3664 より前に考案されたため、その有効性について疑問が生じています。
この疑問に答えるために、C 標準の基本的な側面である「as-if」ルールに目を向けます。このルールは、プログラムの観察可能な動作を維持する限り、実装が特定の要件から逸脱することを許可します。
new はプログラムの戻り値を変更する例外を引き起こす可能性があるため、「as-if」ルールはそれを禁止しているようです。その最適化。ただし、コンパイラーは、例外処理は実装の詳細であると主張する可能性があり、この場合は例外をトリガーしません。したがって、new 呼び出しを削除しても「as-if」ルールに違反することはありません。
さらに、「as-if」ルールは new の非スロー バージョンにも適用されます。ただし、別の翻訳単位に新しい代替演算子が存在すると、観察可能な動作に影響を与える可能性があります。したがって、この最適化を安全に実行するには、コンパイラーはそのようなシナリオが存在しないことを確認する必要があります。
Clang の積極的なアプローチ
以前の Clang バージョンはそのような場合でも最適化されますが、その後は最適化されます。
結論として、コンパイラは、ヒープ メモリの割り当てを最適化する機能を持っています。新品で作りました。ただし、この最適化は、「as-if」ルールの微妙な違いと C の例外処理メカニズムの複雑さに従う必要があります。
以上がC コンパイラはヒープ メモリの割り当てを最適化できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。