2009-11-03 21 views
12

wenn wie dies zu tun:Wie viel Speicher nimmt eine Konstante in C?

const int a = 5; 

Ich frage mich, ob ein 4-Byte-Speicher wie eine Variable nur bekommen? (in 32-Bit-System)

+0

wenn es sowohl global ist und wird nie ändern, geben Sie dem Optimierer eine helfende Hand und machen Sie ihn statisch const int a = 5; ' –

+0

" const "ist ein Schlüsselwort mit falschen Konnotationen. Es erzeugt kein "const" in der täglichen Bedeutung: es erzeugt ein einfaches altes reguläres Objekt, an das nicht geschrieben werden kann. Ich wäre glücklicher, wenn das Schlüsselwort für das Konzept "readonly" wäre, wenn es in die Sprache _no eingeführt wurde, ich denke nicht, dass es gut wäre, es zu ändern ** jetzt ** _ – pmg

+0

Odd. Ich habe C/C++ schon lange nicht mehr benutzt (.Net jetzt), aber ich dachte "const int" wäre ein C++ Zusatz, und Sie brauchten '# define' in C. –

Antwort

-1

Es hängt vom Compiler ab.

Zum Beispiel:

const int a = 4; 

Diese vom Compiler behandelt werden konnten 4 Byte Aufteilung und nur Unveränderlichkeit erzwingen.

Wenn Sie hast einen konstanten String:

static final java.lang.String name = "Foobar"; 

Der Compiler kann den Variable entfernen und ersetzen Sie es mit dem eigentlichen String „Foobar“ überall die Variable verwendet wird. Dies nimmt keinen Platz vom Heapspeicher, aber es muss irgendwo im Programmdatensegment gespeichert werden. Java versucht dies zu tun, wenn es eine Zeichenfolge in Anführungszeichen findet, die an mehreren Stellen verwendet wird, sodass nur eine Kopie davon gespeichert werden muss.

In beiden Fällen eliminieren Konstanten die Speicherzuordnung nicht. Im besten Fall können sie nur den benötigten Speicherplatz minimieren.

+0

Ich denke auch, es hängt vom Compiler ab – root

1

Es hängt von Ihrer Architektur ab, aber ja, ob Sie etwas const machen oder nicht, wirkt sich nicht wirklich auf seine Größe aus, sondern eher auf seine Position im Speicher. Jetzt gibt es einige Compiler-Optimierungen, die möglicherweise das ändern, was Ihrer Meinung nach tatsächlich passiert, aber das ist die Grundidee.

13

Ja wird es. Obwohl, wenn Sie nie seine Adresse nehmen, dann könnte der Optimierer sie vollständig entfernen und nur irgendwelche Referenzen auf die Konstante mit der Nummer 5 in Ihrem Fall ersetzen.

+12

Konstante Objekte in C haben standardmäßig eine externe Verknüpfung. Deshalb ist es für den Optimierer etwas schwierig, sie zu entfernen: Sie müssen aus der Objektdatei exportiert werden. Nur ein fortgeschrittener globaler Optimierer kann das tun, also sei nicht überrascht, wenn er nicht entfernt wird. Wenn Sie in C eine "entfernbare" Konstante haben wollen, müssen Sie sie explizit als "statisch" deklarieren. – AnT

+0

Dies bedeutet, dass der Compiler höchstwahrscheinlich * alle Verweise auf die Konstante durch das Literal '5' ersetzt, aber immer noch keine direkte Freiheit hat, das ursprüngliche konstante Objekt aus dem Speicher zu entfernen (es sei denn, es gibt eine Möglichkeit zu wissen, dass es tatsächlich ist) nie irgendwo im Programm referenziert). – AnT

+0

beim Entfernen aus dem Stack und Heap wird es im Assemblycode (ein oder mehrere Male) vorhanden sein, wenn es nicht zur Kompilierzeit mit einer anderen Konstante gemischt wird. –

0

Es kann die übliche Menge sein, aber wenn Sie es nur so verwenden, dass es nie eine Adresse benötigt, kann der Compiler/Linker es optimieren, so dass es überhaupt keinen Speicher belegt.

0

Im Allgemeinen nimmt die Konstante den gleichen Platz wie eine Variable, also wenn int 32bit auf Ihrer Architektur ist, wird ein 32bit auch nehmen. Der Compiler könnte jedoch auch entscheiden, die Konstante direkt in den Code zu schreiben und keinen Platz für die Konstante selbst zu vergeben. Dies hängt davon ab, wo die Konstante tatsächlich definiert ist, dh ob der Compiler in der Lage ist zu bestimmen, dass es keine Möglichkeit gibt, entweder a zu ändern (z. B. durch Konstanten) oder die Adresse von a zu nehmen.

3

Kommt drauf an.

const int a = 5; 

Werden vier Bytes Speicher (oder wie viele Bytes ein int nimmt auf Ihrem System).

Wenn Sie es statisch machen:

static const int a = 5; 

Dann wird der Optimierer ist frei jede Instanz a mit dem Wert von 5 zu ersetzen.Der Optimierer kann tun, dass nicht in dem ersten (nicht-statisch) Fall, nur weil Sie zu a in einer separaten Übersetzungseinheit mit folgenden Personen:

extern const int a; 
-1

auf einem Embedded-System, in dem Nur-Lese-Speicher von beschreibbaren Speichern getrennt ist Diese Konstante nimmt kein RAM auf, sie wird nur im ROM gespeichert. Gleichermaßen werden Konstanten auf einem System mit virtuellem Speicher in Nur-Lese-Speicherseiten geladen und nehmen nur einmal RAM auf, egal wie viele laufende Kopien des Programms es gibt.

1

Es gibt keinen Unterschied im Speicherverbrauch zwischen int a und const int a.

Beachten Sie jedoch, dass in C-Objekte, die als const deklariert sind, keine konstanten Ausdrücke (im Gegensatz zu C++) und standardmäßig eine externe Verknüpfung (im Gegensatz zu C++) haben. All dies bedeutet, dass in C ein konstantes Objekt so ziemlich dasselbe ist wie ein nicht-konstantes Objekt, gerade nicht modifizierbar.

Es bedeutet auch, dass in C ein konstantes Objekt sehr wenig Chance hat, "entfernt" zu werden, wie andere Antworten behaupten. Wenn Sie wirklich wollen, dass es in C "entfernbar" macht, müssen Sie es explizit als static deklarieren. Aber selbst das wird kein const int Objekt bilden, um konstante Ausdrücke zu bilden, d. H. Sie können es immer noch nicht verwenden, um die Arraygröße in C89/90 zu bestimmen, und in C99 ist das resultierende Array immer noch ein Array variabler Länge (VLA).

0

eine konstante Größe erfordert 4 Byte Speicher, aber wenn es ein Wert ist, erfordert es 0 Byte, da der Assembler-Code wird der Wert wie dieser

mov eax, 5

hier 5 DO NOT embbed kommt aus einer Variablen, aber es ist die Konstante 5, und es wird sogar schneller Code generieren, da kein Speicheraufruf erforderlich ist, um den Wert abzurufen, es ist nur Teil des Assembly-Codes

Verwandte Themen