Heim >Backend-Entwicklung >C++ >Können unterschiedliche C-Funktionen dieselbe Adresse haben?

Können unterschiedliche C-Funktionen dieselbe Adresse haben?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-08 03:34:11449Durchsuche

Can Distinct C   Functions Have the Same Address?

Funktionszeigergleichheit und Funktionsverschmelzung

Frage:

Können verschiedene Funktionen dasselbe haben? Adresse? Sind beispielsweise &foo und &bar garantiert ungleich und &foo und &foo garantiert eindeutig?

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 sind erforderlich, um eindeutige Werte zu generieren, die im Vergleich zur Adresse einer deklarierbaren Funktion ungleich sind. Dies bedeutet, dass Funktionen mit derselben Adresse diese Anforderung nicht erfüllen würden.

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!

Stellungnahme:
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