Heim >Backend-Entwicklung >C++ >Haben eindeutige C-Funktionen immer eindeutige Adressen?
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!