Heim > Backend-Entwicklung > C++ > Verfügen eindeutige C-Funktionen immer über eindeutige Funktionszeigeradressen?

Verfügen eindeutige C-Funktionen immer über eindeutige Funktionszeigeradressen?

Mary-Kate Olsen
Freigeben: 2024-12-01 22:39:19
Original
574 Leute haben es durchsucht

Do Distinct C   Functions Always Have Distinct Function Pointer Addresses?

Funktionszeigergleichheit und eindeutige Adressen

Frage:

In C gibt es Funktionszeiger für unterschiedliche Funktionen, die garantiert unterschiedliche Adressen haben? Insbesondere für den folgenden Code:

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

template<class T> void foo() { }
Nach dem Login kopieren

Sind &foo != &bar und &foo != &foo garantiert wahr?

Antwort:

Der Standard verlangt nicht explizit, dass Funktionszeiger für unterschiedliche Funktionen unterschiedliche Adressen haben. Allerdings ermöglicht es Implementierungen, Funktionen mit identischen Definitionen zu optimieren, und diese Optimierung kann zu identischen Funktionsadressen führen.

Tatsächlich faltet Microsoft Visual C (MSVC) Funktionen mit identischen Implementierungen aggressiv und weist ihnen dieselbe Adresse zu . Dieses Verhalten gilt als nicht konform.

Andererseits bietet der Gold-Linker eine sicherere Einstellung, die unterschiedliche Adressen für Funktionen beibehält, auch wenn diese identische Definitionen haben.

Detaillierte Beschreibung Erläuterung:

Der C-Standard definiert Gleichheit für Funktionszeiger als folgt:

  • Zwei Funktionszeiger sind gleich, wenn sie auf dieselbe Funktion zeigen.
  • Alternativ gilt: Wenn beide Funktionszeiger die gleiche Adresse darstellen, sind sie es auch als gleich angesehen.

Die letztgenannte Bedingung gibt Spielraum für Implementierungen zum Aliasieren verschiedener Funktionen und erfordert nicht explizit Zeiger auf verschiedene Funktionen ungleich sein.

Das Annehmen der Adresse einer Funktion ist jedoch ein beobachtbares Verhalten, und das Ändern der Adresse kann gegen die „Als-ob“-Regel verstoßen. Diese Regel erfordert, dass das Verhalten der Implementierung nicht von dem im Standard angegebenen Verhalten zu unterscheiden ist.

Obwohl der Standard das Aliasing von Funktionsadressen nicht ausdrücklich verbietet, kann daher argumentiert werden, dass es gegen die „Als-ob“-Regel verstößt , was zu Nichtkonformität führt Verhalten.

Beobachtungen:

  • Das Ändern von Funktionsadressen kann Programme stören, die auf eindeutige Funktionsadressen angewiesen sind, beispielsweise solche, die Funktionszeiger als eindeutige Werte verwenden.
  • Einige Linker, darunter Gold und LLVMs lld, führen Optimierungen durch, die problematisches Adress-Aliasing nur dann vermeiden, wenn notwendig.

Schlussfolgerung:

Während der Standard das Aliasing von Funktionsadressen zulässt, wird allgemein empfohlen, diese Optimierung zu vermeiden, da sie zu Portabilitäts- und Zuverlässigkeitsproblemen führen kann .

Das obige ist der detaillierte Inhalt vonVerfügen eindeutige C-Funktionen immer über eindeutige Funktionszeigeradressen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage