Funktionszeigergleichheit und Funktionsverschmelzung
Frage:
Können verschiedene Funktionen dasselbe haben? Adresse? Sind beispielsweise &foo und &bar garantiert ungleich und &foo
Antwort:
Der C-Standard ermöglicht Implementierungen, Funktionen mit identischen Definitionen zu optimieren und sie zu einer einzigen Funktion zusammenzuführen. Dies bedeutet, dass die Adressen zweier solcher Funktionen möglicherweise nicht unterschiedlich sind.
Standardkonformität:
Fehlerbericht 1400 zur Funktionszeigergleichheit erkennt diese Optimierung an, legt jedoch nahe, dass dies nicht der Fall ist Es ist klar, ob die Norm explizit darauf eingehen muss. In der Antwort des Ausschusses heißt es, dass Implementierungen innerhalb der Einschränkungen der „Als-ob“-Regel frei optimiert werden können.
„Als-ob“-Regel:
Unter Gemäß der „Als-ob“-Regel kann eine Implementierung beobachtbares Verhalten emulieren, ohne bestimmte Implementierungsdetails einzuhalten. Da Adressen von Funktionen nicht explizit unterschiedlich sein müssen, verstößt diese Optimierung nicht gegen die Regel.
Gleichheitsoperatoren:
Gemäß Abschnitt 5.10 des Standards zwei Zeiger sind gleich, wenn sie beide null sind, auf dieselbe Funktion zeigen oder dieselbe Adresse darstellen. Dadurch können Implementierungen zwei Funktionen dieselbe Adresse zuweisen, wenn sie identische Definitionen haben.
Beobachtungen:
Keith Thompson merkt an, dass das Drucken des Ergebnisses von &foo == &bar ist beobachtbares Verhalten. Eine Änderung des beobachtbaren Verhaltens durch das Zusammenführen von Funktionen könnte solche Programme möglicherweise beschädigen.
Darüber hinaus können Makros wie SIG_DFL und SIG_ERR in
Interprozedurale Optimierung:
Jan Hubička, ein GCC-Entwickler, bestätigt, dass das Falten identischer Funktionen mit dem gleiche Adresse ist nicht konformes Verhalten. Es zerstört bestimmte Teile des vorkompilierten Header-Codes von GCC, die auf Adressvergleichen basieren.
Schlussfolgerung:
Während der Standard die Optimierung der Zusammenführung identischer Funktionen nicht ausdrücklich verbietet, ist dies der Fall Es ist wichtig, die möglichen Auswirkungen auf Code zu berücksichtigen, der auf eindeutigen Funktionsadressen beruht. Implementierungen sollten diese Optimierung mit Vorsicht angehen und sie in Fällen vermeiden, in denen beobachtbares Verhalten beeinträchtigt würde.
Das obige ist der detaillierte Inhalt vonKönnen unterschiedliche C-Funktionen dieselbe Adresse haben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!