Im bereitgestellten Codeausschnitt belegen zwei Variablen scheinbar dieselbe Speicheradresse, bleiben aber bestehen verschiedene Werte. Um dieses Paradox zu lösen, ist es wichtig, die Semantik von const und die möglichen Compiler-Optimierungen zu verstehen, die sein Verhalten neu definieren können.
Der Code Initialisiert eine const int-Variable N mit dem Wert 22. Anschließend erhält sie einen Zeiger pN auf die Adresse von N durch kreatives Umwandeln eines Zeigers auf eine Konstante in einen Zeiger auf eine Nicht-Konstante. Anschließend wird der Wert, auf den pN zeigt, auf 33 geändert, was zur folgenden Ausgabe führt:
N: 22 Address: 0x22ff74 *pN: 33 Address: 0x22ff74
Anscheinend haben sowohl N als auch *pN unterschiedliche Werte, obwohl sie auf denselben Speicherort verweisen. Dieser scheinbare Widerspruch rührt von Compiler-Optimierungen her, die konstante Werte als Konstanten zur Kompilierungszeit interpretieren.
In diesem Szenario erkennt der Compiler, dass sich der Wert von N nie ändern wird. Es optimiert den Code, um alle Verweise auf N durch seinen tatsächlichen Wert zu ersetzen und so die const-Bezeichnung effektiv zu umgehen. Diese Optimierung wandelt im Wesentlichen Folgendes um:
*pN = 33;
in:
22 = 33;
Da diese Zuweisung eindeutig ungültig ist, meldet der Compiler einen Fehler. Allerdings weist der betreffende Code den geänderten Wert der Stelle zu, auf die pN ursprünglich gezeigt hat. Dieses Verhalten tritt auf, weil der Compiler es Ihnen ermöglicht, den Speicher zu ändern, auf den ein Konstantenzeiger zeigt, auch wenn die Adresse, auf die gezeigt wird, eine Konstante ist.
Daher behält N aufgrund seiner Konstante seinen ursprünglichen Wert von 22 bei Bezeichnung, pN zeigt auf einen Speicherort, der so geändert wurde, dass er 33 enthält. Letztendlich haben N und *pN unterschiedliche Werte, obwohl sie dieselbe Speicheradresse belegen, was die wichtige Rolle von Compileroptimierungen bei der Gestaltung demonstriert Ausführung des Codes.
Das obige ist der detaillierte Inhalt vonWie können zwei Variablen an derselben Speicheradresse aufgrund von „const'- und Compiler-Optimierungen unterschiedliche Werte enthalten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!