Wenn ich eine Datenstruktur in einer C ++ - Anwendung global deklariere, verbraucht sie Stapelspeicher oder Heapspeicher?
Zum Beispiel
struct AAA
{
.../.../.
../../..
}arr[59652323];
c++
memory-management
stack
Sameer Karjatkar
quelle
quelle
Antworten:
Da ich mit den Antworten nicht zufrieden war und hoffe, dass derselbe Karjatkar mehr als nur eine einfache Ja / Nein-Antwort lernen möchte, können Sie loslegen.
In der Regel sind einem Prozess 5 verschiedene Speicherbereiche zugeordnet
Wenn Sie wirklich erfahren möchten, was wo gespeichert ist, lesen Sie diese und setzen Sie ein Lesezeichen:
COMPILER, MONTAGE, LINKER UND LADER: EINE KURZE GESCHICHTE (siehe Tabelle w.5)
Anatomie eines Programms im Gedächtnis
quelle
route_t* tblhead = NULL;
Das Problem hier ist die Frage. Nehmen wir an, Sie haben ein winziges C-Programm (++, sie behandeln das genauso) wie folgt:
/* my.c */ char * str = "Your dog has fleas."; /* 1 */ char * buf0 ; /* 2 */ int main(){ char * str2 = "Don't make fun of my dog." ; /* 3 */ static char * str3 = str; /* 4 */ char * buf1 ; /* 5 */ buf0 = malloc(BUFSIZ); /* 6 */ buf1 = malloc(BUFSIZ); /* 7 */ return 0; }
main
Rückgabe effektiv freigegeben . Da es sich um eine Konstante handelt, wird die Zeichenfolge zusammen mit den anderen Zeichenfolgen im statischen Datenraum zugewiesen.static
Schlüsselwort gibt an, dass es nicht auf dem Stapel zugewiesen werden soll.buf1
ist auf dem Stapel, undmalloc
hat einen Rückgabewert von Interesse; Sie sollten immer den Rückgabewert überprüfen.Zum Beispiel:
char * bfr; if((bfr = malloc(SIZE)) == NULL){ /* malloc failed OMG */ exit(-1); }
quelle
Normalerweise verbraucht es keine. Es wird versucht, sie in einem Speichersegment zuzuweisen, das für die Programmausführung wahrscheinlich eine konstante Größe hat. Es kann sich um BSS, Stack, Heap oder Daten handeln.
quelle
Weder. Es ist .data Abschnitt.
quelle
Der globale Speicher wird in einem festen Speicherblock oder auf dem Heap vorab zugewiesen, je nachdem, wie er von Ihrer Anwendung zugewiesen wird:
byte x[10]; // pre-allocated by the compiler in some fixed memory block byte *y main() { y = malloc(10); // allocated on the heap }
EDIT :
Die Frage ist verwirrend: Wenn ich eine Datenstruktur in einer C ++ - Anwendung global zuordne, verbraucht sie Stapelspeicher oder Heapspeicher?
"zuweisen"? Das könnte viele Dinge bedeuten, einschließlich des Aufrufs von malloc (). Es wäre anders gewesen, wenn die Frage lautete: "Wenn ich eine Datenstruktur global deklariere und initialisiere".
Vor vielen Jahren, als CPUs noch 64K-Segmente verwendeten, waren einige Compiler intelligent genug, um dynamisch Speicher vom Heap zuzuweisen, anstatt einen Block im .data-Segment zu reservieren (aufgrund von Einschränkungen in der Speicherarchitektur).
Ich denke ich bin einfach zu alt ....
quelle
Weder das globale Deklarieren einer Datenstruktur in C ++ verbraucht Heap- noch Stack-Speicher. Tatsächlich werden globale Variablen normalerweise in einem Datensegment zugewiesen, dessen Größe während des gesamten Programms unverändert bleibt. Stapel und Heaps werden normalerweise für Variablen verwendet, die während der Ausführung des Programms erstellt und zerstört werden.
quelle
Das globale Objekt selbst belegt Speicher, den die Laufzeit oder der Compiler für ihn reserviert, bevor main ausgeführt wird. Dies sind keine variablen Laufzeitkosten, also weder Stapel noch Heap.
Wenn der ctor des Objekts Speicher zuweist, befindet er sich im Heap, und alle nachfolgenden Zuweisungen durch das Objekt sind Heap-Zuweisungen.
Es hängt von der genauen Art des globalen Objekts ab, ob es sich um einen Zeiger oder um das gesamte Objekt selbst handelt, das global ist.
quelle
Globale Variablen leben auf dem Heap. Dies ist ein Sonderfall, weil sie für das Leben des Programms leben
quelle
Wenn Sie den Speicher explizit selbst durch new oder malloc zuweisen, wird er im Heap zugewiesen. Wenn der Compiler den Speicher zuweist, wird er auf dem Stapel zugewiesen.
quelle