Ich werde den ersten Satz aus Péter Töröks Antwort stehlen, aber anders ausarbeiten: Nicht unbedingt. Es kann auch entschieden werden, nur den Rohwert 5 anstelle des myval
kompilierten Codes zu verwenden.
Die Behandlung myval
wie eine reguläre Variable durch Zuweisen von Speicherplatz im Speicher kann Auswirkungen auf die Leistung haben, die je nach Architektur und Umgang mit dem Speicher von winzig bis schwerwiegend reichen.
Auf diese Weise würde ein Compiler eine Anweisung ausgeben, die etwas in der Art von "Laderegister R mit dem, was sich an der Speicherstelle für befindet myval
" sagt . Die Lage dermyval
als Operand des Befehls kommt er also direkt aus demselben Datenblock wie der Befehl selbst. Auf modernen CPUs ist dieser Wert aufgrund des Befehlsvorabrufs auf dem Chip leicht verfügbar. Mit der vorliegenden Adresse muss die CPU den Wert immer noch aus dem Speicher holen. Das kann schnell gehen, wenn sich der Speicherort in der Nähe im Cache befindet, oder nicht so schnell, wenn dies nicht der Fall ist. Die CPU muss nicht nur vom Chip abweichen, um den Wert zu erhalten, sondern kann auch dazu führen, dass andere, nützlichere Daten aus dem Cache entfernt werden, die später wieder eingefügt werden müssen. Wenn das Programm unter einem Betriebssystem ausgeführt wird, das den Speicher virtualisiert, kann der Zugriff auf diesen Speicherort einen Seitenfehler verursachen, der dazu führt, dass das Programm in den Ruhezustand versetzt wird, bis die erforderliche Seite über periphere (z. B. Festplatten-) E / A in den RAM gebracht wird.
Durch Festverdrahtung des konstanten Werts mit dem Objektcode würde der Compiler eine Anweisung wie "Laderegister R mit dem Wert 5
" ausgeben . Wie die oben beschriebene Speicheradresse 5
wäre das ein Operand für den Befehl und auf die gleiche Weise verfügbar (dh vorabgerufen). Hier endet die Ähnlichkeit, denn die CPU verfügt nun über alles, was sie benötigt, um das 5
Register R zu erstellen und mit ihrem Geschäft fortzufahren. Da Adressen und Register normalerweise die gleiche Größe haben, gibt es keinen Unterschied in der Anzahl der Bytes, die der Befehl belegt, und die tatsächliche Ausführung erfolgt ohne Wahrscheinlichkeit von Cache-Fehlern und Seitenfehlern, die auftreten können, wenn Sie etwas aus dem Speicher fischen.
Der Compiler könnte, wie Péter betonte, Speicherplatz und ein Symbol für myval
Debug-Builds zuweisen . Es würde nicht schaden, dies zu tun und seinen Wert immer noch fest zu verdrahten, da der Wert auf jeden Fall derselbe bleibt und das Symbol wirklich nur für uns Menschen zum Debuggen da ist.
Beachten Sie, dass dies nur für Werte gilt, die in Registern gespeichert werden können, da Register von Natur aus Ganzzahlen sind. Andere Konstanten werden im Speicher gespeichert.
storage of const object
die Quelle Ihrer Frage wenig Wert.