Wie ordnet der Compiler (zB GCC) zu const
und static const
Variable, wie in, wo würde es sich befinden? Im Datenspeicher oder Programmspeicher?
Konstante vs. Statische Konstante
freonix
Dietrich Ep
Dies hängt von Ihrem System und davon ab, wie Sie die Variable verwenden. Zum static
Variablen:
Fall 1: Sie verwenden die Variable nie, und der Compiler verwirft sie stillschweigend. Das kann mit nicht passieren extern
Variablen.
Fall 2: Sie verwenden die Variable, aber Sie nehmen nie ihre Adresse. Der Compiler wandelt die Verwendung der Variablen in Direktoperanden um, als wäre es eine #define
oder enum
. Der Compiler kann immer noch konvertieren extern
static zu unmittelbaren Operanden, aber es muss trotzdem eine Adresse dafür gefunden werden.
Fall 3: Sie verwenden die Variable und nehmen ihre Adresse, der Compiler ist gezwungen, einen Platz zu finden, um sie genau so in den Objektcode einzufügen, als ob sie es wäre extern
.
Was “Daten” versus “Programm”-Speicher betrifft, nun, das ist sehr spezifisch für das System, das Sie verwenden. Auf meinem Linux x64/ELF-System wird es wahrscheinlich in die .rodata
Abschnitt, der in dasselbe Segment wie Code geht (.text
), aber ein anderes Segment als Read-Write-Datenabschnitte (.bss
, .data
). Mein System scheint kein separates Segment für schreibgeschützte, nicht ausführbare Daten zu erstellen.
Nachtrag: Beachten Sie, dass das Verhalten in C++ anders ist. In C++, a const
Variable hat standardmäßig eine interne Verknüpfung, also static const
ist überflüssig u extern const
ist notwendig, um eine Konstante mit externer Verknüpfung zu erhalten.
Dietrich hat den Fall bereits erläutert static
Variablen gut.
Für lokale Variablen hat die Compiler-Implementierung mehrere Möglichkeiten, wo a zugewiesen werden soll const
qualifizierte Variable, für die die Adresse genommen wird. Es kann auf dem Stack oder im statischen Speicher zugewiesen werden oder nicht. Dies gilt insbesondere für const
qualifizierte zusammengesetzte Literale. Die Adressen von zwei solchen Literalen, die lokal in unterschiedlichen Gültigkeitsbereichen deklariert sind, können zu einer zusammengefasst werden, und ihre Adressen können gleich sein.