„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Ist die Speicheradresse eines String-Literals über Übersetzungseinheiten in C und C++ hinweg konsistent?

Ist die Speicheradresse eines String-Literals über Übersetzungseinheiten in C und C++ hinweg konsistent?

Veröffentlicht am 13.11.2024
Durchsuche:748

Is the Memory Address of a String Literal Consistent Across Translation Units in C and C  ?

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.

  • GCC: Unterstützt das String-Literal-Pooling über Kompilierungseinheiten hinweg mit dem Flag -fmerge-constants. Dieses Verhalten kann mit -fno-merge-constants deaktiviert werden.
  • Visual Studio: Enthält eine Option (/GF) für String-Literal-Pooling.
  • Sonstiges Compiler: Unterstützen möglicherweise das String-Literal-Pooling oder auch nicht, und es ist Implementierungsspezifisch.

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.

Neuestes Tutorial Mehr>

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