const int belegt keinen Platz?

8

In einem Kommentar zu dieser Antwort auf die Verwendung von Anonymous enum , Oli Charlesworth gibt Folgendes an:

  

const int ist unveränderlich und braucht keinen Platz abhängig von   was der Compiler vornimmt.

Wenn ich const int i = 10 deklariere, wie ist das 10 gespeichert, wenn es "keinen Platz braucht"?

Angenommen, ein int ist 4 Bytes, würde ich annehmen, dass mindestens 4 Bytes reserviert sind, um 10 als const int zu speichern.

    
Community 22.08.2011, 13:14
quelle

7 Antworten

9

Dem Compiler steht es frei, den Code so zu optimieren, wie er es für richtig hält, solange der resultierende Code dieselben beobachtbaren Nebenwirkungen bietet.

So können Variablen so optimiert werden, dass sie nur in Registern vorkommen oder durch unmittelbare Werte ersetzt werden. Im Pseudo-Maschinen-Code:

%Vor%

könnte werden:

%Vor%

oder einfach nur:

%Vor%     
Oliver Charlesworth 22.08.2011, 13:18
quelle
6

Wenn Sie i nicht auf eine Weise verwenden, die eine Adresse erfordert, wird der Compiler in der Regel nur zur Kompilierzeit verwendet, und zur Laufzeit bleibt nur die 10 , keine Variable.

Insbesondere, da sich ein const nicht ändert, müssen Sie ihn nicht im Speicher ablegen, es sei denn, Sie tun etwas, das es an eine Funktion weitergibt, die einen Parameter als Referenz verwendet.

    
Jerry Coffin 22.08.2011 13:19
quelle
4

Nun, es ist ein wenig irreführend zu sagen, dass es no Leerzeichen braucht, da der Wert natürlich immer noch im Befehlsbereich im Speicher verbleibt, aber kein Speicherplatz zugewiesen wird, um die Variable zu speichern als der fragliche Datentyp. Es könnte angemessener sein zu sagen, dass die minimale Menge an Speicher möglich ist, was meiner Meinung nach das ist, worauf Ihre Reaktion hinweist.

    
jwrush 22.08.2011 13:27
quelle
3

Der Compiler kann Nummer 10 immer dann ersetzen, wenn er i lesen muss, anstatt den gespeicherten Wert zu lesen.

    
hamstergene 22.08.2011 13:19
quelle
2

Es könnte Teil des Codes sein und als Konstante sofortiger Wert (wie zum Beispiel #define FIVE 5 ) verwendet werden.

    
MByD 22.08.2011 13:18
quelle
2

Der Compiler ersetzt einfach alle Vorkommen von i in Ihrem Code durch die Konstante 10. Kein i mehr, daher kein Platzbedarf, es kostet dasselbe (wenn der Compiler nicht einfach dumm ist oder Sie Casting sieht weg die const) als mit magischen Zahlen, macht nur für viel mehr lesbaren Code. Mit kleinen Konstanten kann es möglich sein, sie in die Montageanleitung zu falten.

    
Christopher Creutzig 22.08.2011 13:19
quelle
0

Es wird sehr wahrscheinlich Speicherplatz belegen, wenn Sie es im globalen Namespace deklarieren. Wenn Sie es in einem Funktionskörper deklarieren oder irgendwo "statisch" deklarieren, kann der Compiler es entfernen. Wenn Sie es global deklarieren, kann der Compiler nicht wissen, ob die Konstante von einer anderen Übersetzungseinheit referenziert wird.

    
chmeee 22.08.2011 15:28
quelle

Tags und Links