Heim >Backend-Entwicklung >C++ >Haben eindeutige C-Funktionen immer eindeutige Adressen?

Haben eindeutige C-Funktionen immer eindeutige Adressen?

Susan Sarandon
Susan SarandonOriginal
2024-12-02 05:41:10381Durchsuche

Do Distinct C   Functions Always Have Distinct Addresses?

Haben unterschiedliche Funktionen unterschiedliche Adressen?

In C wird normalerweise davon ausgegangen, dass Funktionen mit unterschiedlichen Implementierungen unterschiedliche Adressen haben. Dies trifft jedoch in bestimmten Szenarien möglicherweise nicht immer zu.

Funktionsfaltungsoptimierung

Optimierende Compiler können Funktionsfaltung verwenden, um Funktionen mit identischen Implementierungen in einer einzigen Entität zusammenzuführen. Dies kann dazu führen, dass die Funktionen dieselbe Adresse verwenden.

Während der C-Standard Implementierungen erlaubt, solche Optimierungen durchzuführen, bleibt unklar, ob es explizit zulässig ist, dass Funktionen dieselbe Adresse verwenden.

Als-ob-Regel und beobachtbares Verhalten

Unter der Als-ob-Regel können Compiler Code optimieren, wenn das beobachtbare Verhalten vorliegt bleibt unverändert. Das Annehmen der Adresse einer Funktion gilt als beobachtbares Verhalten.

Standardinterpretation

Der Fehlerbericht 1400 geht dieses Problem etwas vage an. Es wird anerkannt, dass Implementierungen Funktionen aliasen können, lässt aber die genaue Interpretation des Standards zur Debatte.

Beobachtungen

Es gibt Bedenken, dass die Funktionsfaltung darauf angewiesene Programme beschädigen könnte eindeutige Adressen für Funktionen. Beispielsweise könnte die Verwendung von Funktionsadressen als eindeutige Bezeichner problematisch sein, wenn sie von mehreren Funktionen gemeinsam genutzt werden.

C11-Anforderungen

Der C11-Standard erfordert Makros wie SIG_DFL und SIG_ERR um eindeutige Werte zu generieren, die im Vergleich zu keiner deklarierbaren Funktion ungleich sind. Dies deutet darauf hin, dass der C-Standard verbietet, dass Funktionen dieselbe Adresse haben.

Neueste Entwicklungen

Ein gcc-Entwickler stellte klar, dass die aggressive Funktionsfaltung von MSVC gegen den Standard verstößt. Darüber hinaus wird in llvm-dev-Diskussionen betont, dass intelligentere Linker die Kombination von Funktionen vermeiden, es sei denn, eine davon wird ausschließlich für Aufrufe und nicht zur Adressbeobachtung verwendet.

Schlussfolgerung

Basierend auf den verfügbaren Informationen ist noch unklar, ob der aktuelle C-Standard Funktionsfaltungsoptimierungen, die dazu führen, dass identische Funktionen dieselbe Adresse teilen, ausdrücklich verbietet oder zulässt. Die As-if-Regel gibt Compilern die Freiheit zur Optimierung, das beobachtbare Verhalten (übernehmen von Funktionsadressen) sollte jedoch unberührt bleiben. Es ist jedoch Vorsicht geboten, da das Falten von Funktionen möglicherweise Code beschädigen kann, der auf eindeutigen Funktionsadressen basiert.

Das obige ist der detaillierte Inhalt vonHaben eindeutige C-Funktionen immer eindeutige Adressen?. 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