Wenn ich in einer C++ - Anwendung eine Datenstruktur global deklariere, verbraucht sie Stapelspeicher oder Heapspeicher?
Für zB
struct AAA
{
.../.../.
../../..
}arr[59652323];
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.
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
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;
}
main
zurückgegeben wird. Die Zeichenfolge wird, da sie eine Konstante ist, zusammen mit den anderen Zeichenfolgen im statischen Datenbereich zugewiesen.static
weist Sie darauf hin, dass es nicht auf dem Stack zugewiesen werden soll.buf1
ist auf dem Stack 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);
}
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.
Weder. Es ist der Abschnitt .data.
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 ....
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.
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.