Wo werden Variablen in C++ gespeichert?
Im RAM oder im Cache des Prozessors?
Wo werden Variablen in C++ gespeichert?
Im RAM oder im Cache des Prozessors?
Ich glaube, Sie verwechseln da zwei Begriffe. Erstens, wie speichert die Sprache C++ Variablen im Speicher. Zweitens, wie verwaltet der Computer und das Betriebssystem diesen Speicher.
In C++ können Variablen auf dem Stapel (Stack) abgelegt werden, d. h. in einem Speicher, der für die Verwendung durch das Programm reserviert ist und dessen Größe beim Start des Threads festgelegt ist, oder in einem dynamischen Speicher, der mit new spontan zugewiesen werden kann. Ein Compiler kann sich auch dafür entscheiden, die Variablen in Registern im Prozessor zu speichern, wenn die Analyse des Codes dies zulässt. Diese Variablen würden niemals den Systemspeicher sehen.
Wenn eine Variable im Speicher landet, übernehmen das Betriebssystem und der Prozessorchipsatz die Aufgabe. Sowohl stapelbasierte Adressen als auch dynamische Adressen sind virtuell. Das bedeutet, dass sie sich zu einem bestimmten Zeitpunkt im Systemspeicher befinden können, aber nicht müssen. Die im Speicher befindliche Variable kann im Systemspeicher gespeichert, auf der Festplatte ausgelagert oder in einem Cache auf oder in der Nähe des Prozessors gespeichert sein. Es ist also schwer zu sagen, wo sich diese Daten tatsächlich befinden. Wenn ein Programm eine Zeit lang nicht im Leerlauf war oder zwei Programme um Speicherressourcen konkurrieren, kann der Wert in der Auslagerungsdatei auf der Festplatte gespeichert und wiederhergestellt werden, wenn das Programm an der Reihe ist zu laufen. Wenn die Variable mit einer bestimmten Arbeit verbunden ist, kann sie im Cache des Prozessors mehrmals geändert werden, bevor sie schließlich in den Systemspeicher zurückgespült wird. Der von Ihnen geschriebene Code würde von diesem Vorgang nichts mitbekommen. Er weiß nur, dass er eine Adresse hat, mit der er arbeiten kann, und alle anderen Systeme kümmern sich um den Rest.
In den meisten modernen Systemen ist die Größe des Stapels nicht festgelegt, sondern wird vom Betriebssystem automatisch erweitert, wenn ein Seitenfehler (aufgrund eines leeren Stapels) auftritt.
In Ihrer Antwort wird sehr deutlich, dass zwei verschiedene Dinge vor sich gehen: das "Objektmodell" der Sprache und das RAM/SwapFile/Caching-System. Gute Antwort!
Hallo Paul. Danke für deinen Kommentar. Du hast Recht, dass der Stack virtueller Speicher ist und ausgelagert werden kann. Ich wollte damit sagen, dass seine Größe bei der Zuweisung am Anfang des Threads festgelegt ist. Dies wird durch den Linker geregelt.
Variablen können an verschiedenen Stellen gespeichert werden, manchmal auch an mehreren Stellen. Die meisten Variablen befinden sich im RAM, wenn ein Programm geladen wird; manchmal werden Variablen, die als const
werden stattdessen im ROM abgelegt. Bei jedem Zugriff auf eine Variable, die sich nicht im Cache des Prozessors befindet, kommt es zu einem Cache-Miss, und der Prozessor bleibt stehen, während die Variable aus dem RAM/ROM in den Cache kopiert wird.
Wenn Sie einen halbwegs anständigen optimierenden Compiler haben, werden lokale Variablen stattdessen oft in der Registerdatei eines Prozessors gespeichert. Variablen bewegen sich zwischen RAM, Cache und Registerdatei hin und her, wenn sie gelesen und geschrieben werden, aber sie haben im Allgemeinen immer eine Kopie im RAM/ROM, es sei denn, der Compiler entscheidet, dass das nicht notwendig ist.
ROM bezeichnet üblicherweise einen Speicher, der nur während der Herstellung beschrieben wird - Konstanten-Variablen sind immer noch im Arbeitsspeicher des Computers gespeichert, werden aber während der Programmausführung nicht beschrieben.
Stroustrup spricht oft von Variablen, die im ROM gespeichert sind. Das gilt auch für den Ausschuss für C++-Standards ( open-std.org/jtc1/sc22/wg21/docs/PDTR18015.pdf pg. 75). In Wirklichkeit handelt es sich nicht um physischen ROM, sondern um einen Abschnitt der ausführbaren Datei für Daten (in ELF ist es der Abschnitt .text).
Die Sprache C++ unterstützt zwei Arten der Speicherzuweisung über die Variablen in C++-Programmen:
Die statische Zuweisung erfolgt, wenn Sie eine statische oder globale Variable deklarieren. Jede statische oder globale Variable definiert einen Speicherplatzblock mit einer festen Größe. Der Speicherplatz wird einmalig zugewiesen, wenn Ihr Programm gestartet wird (Teil der exec-Operation), und wird nie wieder freigegeben. Eine automatische Zuweisung erfolgt, wenn Sie eine automatische Variable deklarieren, z. B. ein Funktionsargument oder eine lokale Variable. Der Platz für eine automatische Variable wird zugewiesen, wenn die zusammengesetzte Anweisung, die die Deklaration enthält, eingegeben wird, und wird freigegeben, wenn die zusammengesetzte Anweisung verlassen wird. Die Größe des automatischen Speichers kann ein Ausdruck sein, der variiert. In anderen CPP-Implementierungen muss sie eine Konstante sein. Eine dritte wichtige Art der Speicherzuweisung, die dynamische Zuweisung, wird von C++-Variablen nicht unterstützt, ist aber für Bibliotheksfunktionen verfügbar. Dynamische Speicherzuweisung
Die dynamische Speicherzuweisung ist eine Technik, bei der Programme während der Ausführung bestimmen, wo sie bestimmte Informationen speichern sollen. Eine dynamische Zuweisung ist erforderlich, wenn die benötigte Speichermenge oder die Dauer des Speicherbedarfs von Faktoren abhängt, die vor der Ausführung des Programms nicht bekannt sind.
Sie benötigen beispielsweise einen Block, um eine aus einer Eingabedatei gelesene Zeile zu speichern. Da es keine Begrenzung für die Länge einer Zeile gibt, müssen Sie den Speicher dynamisch zuweisen und ihn dynamisch vergrößern, wenn Sie mehr von der Zeile lesen.
Oder Sie benötigen einen Block für jeden Datensatz oder jede Definition in den Eingabedaten; da Sie nicht im Voraus wissen können, wie viele es sein werden, müssen Sie einen neuen Block für jeden Datensatz oder jede Definition zuweisen, wenn Sie sie lesen.
Bei der dynamischen Zuweisung ist die Zuweisung eines Speicherblocks eine Aktion, die das Programm explizit anfordert. Sie rufen eine Funktion oder ein Makro auf, wenn Sie Speicherplatz zuweisen wollen, und geben die Größe mit einem Argument an. Wenn Sie den Speicherplatz wieder freigeben wollen, rufen Sie eine andere Funktion oder ein Makro auf. Sie können diese Aktionen jederzeit und so oft Sie wollen durchführen.
Dynamische Zuweisung wird von CPP-Variablen nicht unterstützt; es gibt keine Speicherklasse "dynamisch", und es kann niemals eine CPP-Variable geben, deren Wert in dynamisch zugewiesenem Speicherplatz gespeichert ist. Die einzige Möglichkeit, dynamisch zugewiesenen Speicher zu erhalten, ist ein Systemaufruf, und die einzige Möglichkeit, auf dynamisch zugewiesenen Speicher zu verweisen, ist ein Zeiger. Da sie weniger bequem ist und der eigentliche Prozess der dynamischen Zuweisung mehr Rechenzeit erfordert, verwenden Programmierer die dynamische Zuweisung im Allgemeinen nur, wenn weder die statische noch die automatische Zuweisung ausreicht.
Wenn Sie zum Beispiel dynamisch Speicherplatz für eine struct foobar zuweisen wollen, können Sie keine Variable vom Typ struct foobar deklarieren, deren Inhalt der dynamisch zugewiesene Speicherplatz ist. Sie können jedoch eine Variable vom Zeigertyp struct foobar * deklarieren und ihr die Adresse des Platzes zuweisen. Dann können Sie die Operatoren '*' und '->' auf diese Zeigervariable anwenden, um auf den Inhalt des Platzes zu verweisen:
{
struct foobar *ptr
= (struct foobar *) malloc (sizeof (struct foobar));
ptr->name = x;
ptr->next = current_foobar;
current_foobar = ptr;
}
Je nachdem, wie sie deklariert werden, werden sie entweder in der " Haufen " oder der " Stapel "
Der Heap ist ein dynamisch Datenstruktur, die die Anwendung verwenden kann.
Wenn die Anwendung Daten verwendet, müssen diese in die CPU-Register verschoben werden, bevor sie verbraucht werden, wobei es sich jedoch um einen sehr flüchtigen und temporären Speicher handelt.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
0 Stimmen
Diese Frage macht keinen Sinn, da (die meisten) Caches transparent sind und eigentlich nur ein Teil des Speichersystems sind. Sie ist auch deshalb fehlerhaft, weil es wirklich von der Architektur und dem Compiler abhängt, wo die Variablen von C++ (oder jeder anderen kompilierten Sprache) gespeichert werden.
0 Stimmen
Auch der Titel der Frage könnte deutlich verbessert werden
1 Stimmen
@Tal, wie andere schon sagten, ist die Frage wie gesagt etwas vage. Vielleicht sollten Sie sich die Kommentare der Leute ansehen und sehen, ob Sie eine etwas spezifischere Frage stellen können.
2 Stimmen
Was können wir mit Fragen anfangen, die nicht gestellt werden sollten? Kann ich sie mit "Mu" kennzeichnen?
0 Stimmen
OK, ich habe es getan. de.wikipedia.org/wiki/W%C3%BA