関数ポインタの等価性と固有のアドレス
質問:
C では、 は関数ポインタです個別のアドレスを持つことが保証されている個別の関数の場合?具体的には、次のコードの場合:
void foo() {} void bar() {} template<class T> void foo() { }
Are &foo != &bar and &foo
答え:
標準では、個別の関数が個別のアドレスを持つために関数ポインタを明示的に要求しません。ただし、実装が同一の定義を持つ関数を最適化することは可能であり、この最適化により、同一の関数アドレスが得られる可能性があります。
実際、Microsoft Visual C (MSVC) は、同一の実装を持つ関数を積極的に折りたたんで、同じアドレスを割り当てます。 。この動作は不適合とみなされます。
一方、Gold リンカーは、関数の定義が同じであっても、関数の個別のアドレスを維持するより安全な設定を提供します。
詳細説明:
C 標準では、関数ポインタの等価性を次のように定義しています。
後者の条件は、実装に異なる関数のエイリアスを与える自由度を与えますが、そうではありません。異なる関数へのポインタが等しくないことを明示的に要求します。
ただし、関数のアドレスを取得することは観察可能な動作であり、アドレスを変更すると「as-if」ルールに違反する可能性があります。このルールは、実装の動作が標準で指定されている動作と区別できないことを要求します。
したがって、標準は関数アドレスのエイリアシングを明示的に禁止していませんが、「as-if」ルールに違反していると主張することができます。 、不適合につながる
所見:
結論:
標準では関数アドレスのエイリアスが許可されていますが、移植性が生じる可能性があるため、一般にこの最適化を避けることをお勧めします。そして信頼性の問題。
以上が個別の C 関数には常に個別の関数ポインタ アドレスがありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。