ホームページ >バックエンド開発 >C++ >個別の C 関数には常に個別の関数ポインタ アドレスがありますか?

個別の C 関数には常に個別の関数ポインタ アドレスがありますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-01 22:39:19582ブラウズ

Do Distinct C   Functions Always Have Distinct Function Pointer Addresses?

関数ポインタの等価性と固有のアドレス

質問:

C では、 は関数ポインタです個別のアドレスを持つことが保証されている個別の関数の場合?具体的には、次のコードの場合:

void foo() {}
void bar() {}

template<class T> void foo() { }

Are &foo != &bar and &foo != &foo true であることが保証されていますか?

答え:

標準では、個別の関数が個別のアドレスを持つために関数ポインタを明示的に要求しません。ただし、実装が同一の定義を持つ関数を最適化することは可能であり、この最適化により、同一の関数アドレスが得られる可能性があります。

実際、Microsoft Visual C (MSVC) は、同一の実装を持つ関数を積極的に折りたたんで、同じアドレスを割り当てます。 。この動作は不適合とみなされます。

一方、Gold リンカーは、関数の定義が同じであっても、関数の個別のアドレスを維持するより安全な設定を提供します。

詳細説明:

C 標準では、関数ポインタの等価性を次のように定義しています。

  • 2 つの関数ポインタは、同じ関数を指している場合、同等と比較されます。
  • あるいは、両方の関数ポインタが 同じアドレスを表す場合、それらは同じです。

後者の条件は、実装に異なる関数のエイリアスを与える自由度を与えますが、そうではありません。異なる関数へのポインタが等しくないことを明示的に要求します。

ただし、関数のアドレスを取得することは観察可能な動作であり、アドレスを変更すると「as-if」ルールに違反する可能性があります。このルールは、実装の動作が標準で指定されている動作と区別できないことを要求します。

したがって、標準は関数アドレスのエイリアシングを明示的に禁止していませんが、「as-if」ルールに違反していると主張することができます。 、不適合につながる

所見:

  • 関数アドレスを変更すると、関数ポインターを一意の値として使用するプログラムなど、一意の関数アドレスに依存するプログラムが中断される可能性があります。
  • Gold や LLVM の lld を含む一部のリンカーは、問題のあるアドレスを回避する最適化を実行します。必要な場合にのみエイリアスを使用します。

結論:

標準では関数アドレスのエイリアスが許可されていますが、移植性が生じる可能性があるため、一般にこの最適化を避けることをお勧めします。そして信頼性の問題。

以上が個別の C 関数には常に個別の関数ポインタ アドレスがありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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