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() { }
Sind &foo != &bar und &foo
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:
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:
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!