ホームページ >バックエンド開発 >C++ >コンパイラーは C の「new」呼び出しを最適化して取り除くことができますか?

コンパイラーは C の「new」呼び出しを最適化して取り除くことができますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-02 00:19:15772ブラウズ

Can Compilers Optimize Away `new` Calls in C  ?

コンパイラはヒープ メモリ割り当てを削除できますか?

C では、ヒープにメモリを割り当てるために new 演算子が使用されます。コンパイラーは、不要なステートメントを削除するなど、コードを最適化する場合があります。コンパイラは new を使用して行われたヒープ メモリ割り当てを排除できますか?

コンパイラの動作

調査によると、コンパイラによってヒープ割り当ての処理方法が異なることがわかっています:

  • g (5.2.0) と Visual Studio 2015 は新しいものを最適化しません。 call.
  • clang (3.0 ) は、完全な最適化フラグを使用しても、新しい呼び出しを最適化します。

最適化の有効性

有効性コンパイラの最適化については議論の対象となっています。新しい呼び出しには観察可能な動作 (例外のスローなど) がある可能性があるため、コンパイラーは新しい呼び出しを最適化することはできないと主張する人もいます。観察可能な動作が影響を受けないことをコンパイラが保証できれば、新しい呼び出しの最適化は許可されると主張する人もいます。

C 14 Standard

N3664: メモリ割り当ての明確化により、コンパイラの最適化とメモリ割り当てに関するルール。これにより、コンパイラは特定のシナリオでメモリ割り当てを最適化できます。ただし、この規定は因果関係に違反する可能性があるため批判されています。

追加の考慮事項

  • 非スロー新規: Clang も最適化します。投げていない新しい人たちへの呼びかけ演算子.
  • オーバーライドされた演算子 new: 異なる翻訳単位でのカスタム グローバル演算子の new 実装は、ヒープ割り当てに関連するコンパイラの最適化の有効性に影響を与える可能性があります。

結論

ヒープを最適化するコンパイラーの機能メモリ割り当ては、コンパイラの動作、言語標準、潜在的な例外が関係する複雑な問題です。一部のコンパイラは N3664 に基づいてこの最適化を実装していますが、その有効性は依然として議論の対象であり、C 標準やカスタム メモリ アロケータの存在などの特定の状況に依存します。

以上がコンパイラーは C の「new」呼び出しを最適化して取り除くことができますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。