個別の関数には個別のアドレスがありますか?
C では、通常、異なる実装を持つ関数には個別のアドレスがあると想定されます。ただし、これは特定のシナリオでは常に当てはまらない場合があります。
関数の折りたたみの最適化
最適化コンパイラでは、関数の折りたたみを使用して、同一の実装を持つ関数を 1 つのエンティティにマージする場合があります。これにより、関数が同じアドレスを共有する可能性があります。
C 標準では実装でそのような最適化を実行することが許可されていますが、関数が同じアドレスを共有することが明示的に許可されているかどうかは不明のままです。
as-if ルールと監視可能な動作
as-if ルールの下では、コンパイラは次のことができます。観察可能な動作が変わらない場合はコードを最適化します。関数のアドレスを取得することは、観察可能な動作と見なされます。
標準解釈
欠陥レポート 1400 は、この問題をやや漠然と扱っています。実装が関数のエイリアスを作成する可能性があることは認めていますが、標準の正確な解釈については議論の余地があります。
所見
関数の折りたたみにより、依存するプログラムが壊れる可能性があるという懸念があります。関数の個別のアドレス。たとえば、関数アドレスを一意の識別子として使用すると、複数の関数で共有されている場合に問題が発生する可能性があります。
C11 要件
C11 標準では、SIG_DFL や SIG_ERR などのマクロが必要です。宣言可能な関数と比較して等しくない個別の値を生成します。これは、C 標準が関数が同じアドレスを持つことを禁止していることを示唆しています。
最近の開発
gcc 開発者は、MSVC の積極的な関数の折りたたみが標準に違反していることを明らかにしました。さらに、llvm-dev の議論では、よりスマートなリンカーは、アドレス監視ではなく呼び出しのみに使用される場合を除き、関数の結合を回避することを強調しています。
結論
入手可能な情報に基づく現在の C 標準が、同一の関数が同じアドレスを共有するような関数の折りたたみの最適化を明示的に禁止しているのか許可しているのかはまだ不明です。 as-if ルールにより、コンパイラは最適化を自由に行うことができますが、観察可能な動作 (関数アドレスの取得) は影響を受けないはずです。ただし、関数を折りたたむと、個別の関数アドレスに依存するコードが壊れる可能性があるため、注意が必要です。
以上が個別の C 関数には常に個別のアドレスがありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。