String-Literal-Adresskonflikte über Übersetzungseinheiten hinweg
In C und C wird oft davon ausgegangen, dass String-Literale innerhalb verschiedener Übersetzungseinheiten (Objektdateien) vorliegen Die beim Kompilieren erstellten Dateien haben dieselbe Speicheradresse. Diese Idee ist jedoch nicht auf Compiler und Implementierungen übertragbar.
Gemäß den C99- und C-Entwurfsstandards wird das Verhalten in Bezug auf identische Zeichenfolgenliterale ausdrücklich nicht spezifiziert. Dies bedeutet, dass es dem Compiler freisteht, sie zu bündeln oder zusammenzuführen oder separate Instanzen für jede Referenz zu erstellen.
Visual Studio erlaubt explizit das Poolen von Zeichenfolgenliteralen über die Compileroption /GF, während GCC es mit den -fmerge-Konstanten unterstützt Flagge. Allerdings nutzen beide Compiler diese Funktion bedingt, abhängig von der Verfügbarkeit spezifischer Hardware oder Linker-Unterstützung.
Daher ist es nicht portierbar, sich für Zeichenfolgenliterale über verschiedene Übersetzungseinheiten hinweg auf dieselbe Speicheradresse zu verlassen. Selbst innerhalb derselben Übersetzungseinheit können Compileroptimierungen zu unvorhersehbarem Verhalten beim Umgang mit String-Literalen führen.
Dieser Mangel an Standardisierung ist auf die unterschiedliche Natur der C-Implementierungen zum Zeitpunkt der Sprachentwicklung zurückzuführen. Da ROM-basierte Systeme die Speicherung von Zeichenfolgenliteralen im Nur-Lese-Speicher erforderten, wurde es als unpraktisch angesehen, die Eindeutigkeit und Beschreibbarkeit von Zeichenfolgenliteralen zu gewährleisten.
Das obige ist der detaillierte Inhalt vonWarum haben String-Literale über Übersetzungseinheiten hinweg unterschiedliche Speicheradressen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!