関数ポインタの等価性と関数の合体
質問:
異なる関数は同じものを持つことができますか住所?たとえば、&foo と &bar は等しくないことが保証されており、&foo
答え:
C 標準では、実装で同一の定義を持つ関数を最適化し、それらを 1 つの関数に結合することができます。これは、このような 2 つの関数のアドレスが異なっている可能性があることを意味します。
標準準拠:
関数ポインターの等価性に関する欠陥レポート 1400 は、この最適化を認めていますが、そうではないことを示唆しています。標準で明示的に対処する必要があるかどうかを明確にします。委員会からの回答では、実装は「as-if」ルールの制約内で自由に最適化できると述べられています。
「As-If」ルール:
下「as-if」ルールにより、実装は特定の実装の詳細に従うことなく、観察可能な動作をエミュレートできます。関数のアドレスは明確に区別する必要がないため、この最適化はルールに違反しません。
等価演算子:
標準のセクション 5.10 によると、2 つのポインターは、両方とも null であるか、同じ関数を指すか、同じアドレスを表す場合、等しいと比較されます。これにより、実装は 2 つの関数が同一の定義を持つ場合、同じアドレスを割り当てることができます。
観察:
Keith Thompson は、&foo == &bar の結果の出力が次のように行われると述べています。観察可能な行動。関数を結合して監視可能な動作を変更すると、そのようなプログラムが壊れる可能性があります。
さらに、
プロシージャ間の最適化:
GCC 開発者の Jan Hubička は、同一の関数を同じアドレスは不適合動作です。これは、アドレス比較に依存する GCC のプリコンパイル済みヘッダー コードの特定の部分を破壊します。
結論:
標準では、同一関数の結合の最適化を明示的に禁止していませんが、関数アドレスが異なることに依存するコードへの潜在的な影響を考慮することが重要です。実装ではこの最適化に慎重に取り組み、観察可能な動作が影響を受ける可能性がある場合は回避する必要があります。
以上が異なる C 関数は同じアドレスを持つことができますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。