String-Literal-Adresse über Übersetzungseinheiten hinweg
In C und C verwenden Programmierer häufig String-Literale für verschiedene Zwecke. Es stellt sich häufig die Frage: Ist es zuverlässig anzunehmen, dass dasselbe Zeichenfolgenliteral in verschiedenen Übersetzungseinheiten dieselbe Speicheradresse hat?
C/C Standard
Der C99 und C-Standardentwürfe lassen dieses Thema ausdrücklich unbestimmt. In Abschnitt 6.4.5 des C99-Standardentwurfs heißt es: „Es ist nicht spezifiziert, ob diese Arrays [String-Literale] unterschiedlich sind, vorausgesetzt, ihre Elemente haben die entsprechenden Werte.“ Dies bedeutet, dass der Compiler frei entscheiden kann, ob er String-Literale bündelt oder nicht.
Compiler-Implementierungen
In der Praxis weisen verschiedene Compiler unterschiedliche Verhaltensweisen hinsichtlich des Poolings von String-Literalen auf.
Begründung für fehlende Anforderungen
Die Begründung dafür Dass es im C-Standard nicht erforderlich ist, String-Literale zu bündeln, liegt an der Vielfalt der Compiler und Laufzeitumgebungen zu dieser Zeit. Einige Implementierungen speicherten String-Literale im ROM, während andere sie in beschreibbaren Datenabschnitten speicherten. Um die Portabilität zu gewährleisten, wurde es als das Beste erachtet, kein bestimmtes Verhalten vorzuschreiben.
Praktische Überlegungen
Im Allgemeinen ist es nicht portierbar, sich auf String-Literale zu verlassen, die dasselbe haben Speicheradresse über Übersetzungseinheiten hinweg. Innerhalb derselben Übersetzungseinheit ist das Verhalten jedoch eher konsistent, da der Compiler mehr Kontrolle über Optimierungen hat.
Schlussfolgerung
Die Speicheradresse von a Das Zeichenfolgenliteral ist ein Implementierungsdetail und man kann sich nicht darauf verlassen, dass es in allen Übersetzungseinheiten konsistent bleibt. Es ist wichtig, sich dieser Tatsache bewusst zu sein und Code zu schreiben, der unabhängig von solchen Implementierungsdetails ist.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3