it-swarm.com.de

Globale Speicherverwaltung in C++ in Stack oder Heap?

Wenn ich in einer C++ - Anwendung eine Datenstruktur global deklariere, verbraucht sie Stapelspeicher oder Heapspeicher?

Für zB

struct AAA
{

.../.../.
../../..
}arr[59652323];
67

Da ich mit den Antworten nicht zufrieden war und hoffe, dass derselbe Karjatkar mehr als nur eine einfache Ja/Nein-Antwort lernen möchte, los geht's.

Normalerweise hat ein Prozess 5 verschiedene Speicherbereiche zugewiesen.

  1. Code - Textsegment
  2. Initialisiertes Daten - Datensegment
  3. Nicht initialisierte Daten - BSS-Segment
  4. Haufen
  5. Stapel

Wenn Sie wirklich erfahren möchten, was wo gespeichert wird, lesen Sie diese und fügen Sie ein Lesezeichen hinzu:

COMPILER, ASSEMBLER, LINKER UND LADER: EINE KURZE GESCHICHTE (siehe Tabelle w.5)

Anatomie eines Programms im Speicher

alt text http://www.tenouk.com/ModuleW_files/ccompilerlinker006.png

129
Milan

Das Problem hier ist die Frage. Nehmen wir an, Sie haben ein winziges C-Programm (++, das auch so behandelt wird) 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;
}
  1. Dies ist weder auf dem Stack NOR auf dem Heapspeicher zugeordnet. Stattdessen werden sie als statische Daten zugewiesen und auf den meisten modernen Maschinen in einem eigenen Speichersegment abgelegt. Das eigentliche string wird auch als statische Daten zugewiesen und in einem schreibgeschützten Segment in Maschinen mit richtigem Denken abgelegt. 
  2. ist einfach ein statisch zugewiesener Zeiger; Platz für eine Adresse in statischen Daten.
  3. hat den Zeiger auf dem stack zugewiesen und wird effektiv freigegeben, wenn main zurückgegeben wird. Die Zeichenfolge wird, da sie eine Konstante ist, zusammen mit den anderen Zeichenfolgen im statischen Datenbereich zugewiesen.
  4. wird tatsächlich genau wie bei 2 zugewiesen. Das Schlüsselwort static weist Sie darauf hin, dass es nicht auf dem Stack zugewiesen werden soll.
  5. ... aber buf1 ist auf dem Stack und
  6. ... der malloc-Pufferplatz befindet sich auf dem Heap.
  7. Übrigens, Kinder versuchen das nicht zu Hause. malloc 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);
}
27
Charlie Martin

Normalerweise verbraucht es keine. Es versucht, sie in einem Speichersegment zuzuordnen, das für die Programmausführung wahrscheinlich konstant bleibt. Dies kann bss, stack, heap oder data sein.

14
Tomek Kopczuk

Weder. Es ist der Abschnitt .data.

6
EFraim

Globaler Speicher wird in einem festen Speicherblock oder auf dem Heapspeicher vorab zugeordnet, abhängig davon, 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 global in einer C++ - Anwendung zuweise, verbrauchen sie Stapelspeicher oder Heapspeicher?

"zuordnen"? Das könnte viele Dinge bedeuten, einschließlich des Aufrufens von malloc (). Anders wäre es, wenn die Frage lautete: "Wenn ich eine Datenstruktur global deklariere und initialisiere". 

Vor vielen Jahren, als die CPUs noch 64-KByte-Segmente verwendeten, waren einige Compiler intelligent genug, um Speicher dynamisch aus dem Heap zuzuweisen, anstatt einen Block im .data-Segment zu reservieren (aufgrund von Einschränkungen der Speicherarchitektur).

Ich denke ich bin einfach zu alt ....

5

Die globale Deklaration einer Datenstruktur in C++ belegt weder Heap- noch Stack-Speicher. Tatsächlich werden globale Variablen normalerweise in einem Datensegment zugeordnet, dessen Größe während des gesamten Programms unverändert bleibt. Stacks und Heaps werden normalerweise für Variablen verwendet, die während der Ausführung des Programms erstellt und zerstört werden.

Program Memory Space

2
DML

Das globale Objekt selbst beansprucht Speicher, den die Laufzeitumgebung oder der Compiler vor der Ausführung von main für es reserviert. Dies ist kein variabler Laufzeitaufwand, also weder Stack noch Heap.

Wenn der ctor des Objekts Speicher zuweist, befindet er sich im Heap und alle nachfolgenden Zuordnungen durch das Objekt sind Heap-Zuordnungen.

Es hängt von der genauen Beschaffenheit des globalen Objekts ab, ob es sich um einen Zeiger oder um das gesamte globale Objekt handelt. 

0
Rudi Bierach