Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

WhiteMike

Alter Hase

  • »WhiteMike« ist der Autor dieses Themas

Beiträge: 507

Wohnort: Ulm

Beruf: Schüler

  • Private Nachricht senden

1

22.06.2009, 17:39

[Verständnis] Heap vs. Stack

In meinem ersten Programmierbuch (Markt+Technik, C++) habe ich damals gelesen, dass der Heap mehr Speicherplatz bieten soll.

Nachdem ich mich später aber genauer mit dem Speicher befasst und erfahren habe, dass der Heap dem Stack entgegenwächst und beide somit quasi den selben Speicherplatzbereich teilen, frage ich mich, ob die Aussage aus meinem ersten Programmierbuch stimmt.
Das muss nämlich nicht der Fall sein. Der Autor schlägt als weitere Lektüre ein anderes Buch vor, in dem eins seiner Tipps klar widerlegt wird, obwohl er es damals bereits dreimal gelesen haben soll (was auch immer mir diese Information als Leser nützen soll).

Kann jemand etwas Klarheit ins Dunkel bringen?

Mit freundlichen Grüßen,
WhiteMike

Chase

Alter Hase

Beiträge: 753

Wohnort: Nagaoka / Darmstadt / Düsseldorf

Beruf: fauler Studi

  • Private Nachricht senden

2

22.06.2009, 18:35

Ganz grob: Der Heap ist fuer Speicher-Allokation zur Laufzeit. Du kannst davon ausgehen dass du im Heap unendlich Platz zur Verfuegung hast - bis halt der gesamte Speicherplatz des Systems voll ist. Ein eventuelles Vergroessern, Verschieben, etc dieses Speichers ist Sache des Betriebssystems. Einem Programm bloss eine statische Groesse zu geben ist ja quatsch, der belegte Speicher waechst natuerlich dynamisch!
Ich hab keine Ahnung in wie weit Informationen ueber Segmentation noch richtig sind, das meiste was ich darueber gefunden habe ist recht alt.
"Have you tried turning it off and on again?"

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

3

22.06.2009, 19:26

Der Stack hat soweit ich weiß eine feste Größe. Unter windows xp z.B. 1024 kbytes. Was auf den Stack kommt ist klar oder?
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

n0_0ne

1x Contest-Sieger

  • Private Nachricht senden

4

22.06.2009, 22:20

Also ich finde 1MB ist etwas wenig, oder? Ich würde sagen das müsste etwas mehr sein (könnte man ja fast keine rekursiven funktionen mehr benutzen ^^), außerdem kann man die Größe glaub ich auch ändern, aber es stimmt schon, der Stack ist begrenzt. Im Prinzip kommt da alles drauf, was so mit prozeduren zu tun hat, also lokale variablen usw. wenn eine neue funktion aufgerufen wird, werden die benötigten variablen + pointer auf dem stack abgelegt, das passiert aber normalerweise automatisch.
Auch Chase hat recht. du kannst den Heap als unendlich ansehen. Wenn du z.B. 4Gb ram hast und grade 5 programme laufen kann jedes trotzdem 4Gb anfordern. das wird dann auf die festplatte ausgelagert. Mit dem Heap kannst du oft noch etwas performance rausholen, weil der Stack (wird eben alles automatisch gemacht) recht langsam ist. Dafür musst du dich dann aber selbst ums freigeben etc kümmern... und der compiler kann keine fehler mehr erkennen (jedenfalls keine nullpointer etc)

Helmut

5x Contest-Sieger

Beiträge: 692

Wohnort: Bielefeld

  • Private Nachricht senden

5

22.06.2009, 22:33

Zitat von »"n0_0ne"«

Also ich finde 1MB ist etwas wenig, oder? Ich würde sagen das müsste etwas mehr sein (könnte man ja fast keine rekursiven funktionen mehr benutzen ^^), außerdem kann man die Größe glaub ich auch ändern, aber es stimmt schon, der Stack ist begrenzt. Im Prinzip kommt da alles drauf, was so mit prozeduren zu tun hat, also lokale variablen usw. wenn eine neue funktion aufgerufen wird, werden die benötigten variablen + pointer auf dem stack abgelegt, das passiert aber normalerweise automatisch.
Auch Chase hat recht. du kannst den Heap als unendlich ansehen. Wenn du z.B. 4Gb ram hast und grade 5 programme laufen kann jedes trotzdem 4Gb anfordern. das wird dann auf die festplatte ausgelagert. Mit dem Heap kannst du oft noch etwas performance rausholen, weil der Stack (wird eben alles automatisch gemacht) recht langsam ist. Dafür musst du dich dann aber selbst ums freigeben etc kümmern... und der compiler kann keine fehler mehr erkennen (jedenfalls keine nullpointer etc)

1 MB ist nicht wirklich wenig, jedenfalls muss kaum ein Programm das vergrößern, aber ja, man kann die Größe verändern. Und unter Linux kann der Stack beliebig groß werden (glaube ich). Das mehrere Programme 4GB Speicher anfordern mit nur realen 4GB RAM wird nur unter 64Bit funktionieren. Windows muss den Speicher schließlich auch adressieren können. Und mit der Geschwindigkeit irrst du dich auch. Der Stack ist in jedem Bezug schneller als der Heap (um eine konstante Größe in einer Funktion zu "allokieren" braucht man keine einzige Instruction), ist aber eben begrenzt und nach Funktionsende ungültig.

Ciao
Sei stets geduldig gegenüber Leuten, die nicht mit dir übereinstimmen. Sie haben ein Recht auf ihren Standpunkt - trotz ihrer lächerlichen Meinung. (F. Hollaender)

WhiteMike

Alter Hase

  • »WhiteMike« ist der Autor dieses Themas

Beiträge: 507

Wohnort: Ulm

Beruf: Schüler

  • Private Nachricht senden

6

22.06.2009, 22:54

Okay, danke.
Jetzt verstehe ich es, auch wenn ich mich immer noch frage, warum sie jeweils dem anderen entgegen wachsen, wenn sie schlussendlich doch separate Bereiche haben. Oder ist es etwa nur unter Linux so? Ich schreibe später mal ein Programm, um das zu testen.

Und was der Stack und Heap sind bzw. wie sie funktionieren weiß ich sehr gut. Das war auch gar nicht die Frage.

Dass zum Vergrößern des Stacks aber keine Instruktionen benötigt werden, bezweifle ich sehr stark.

Mit freundlichen Grüßen,
WhiteMike

FalkT

Treue Seele

Beiträge: 125

Wohnort: AC

  • Private Nachricht senden

7

22.06.2009, 23:16

Der Stack ist auch unter Windows einstellbar, aber mehr als 4MB sind da unrealistisch.
Vielleicht solltet ihr auch auf den Begriff Call-Stack eingehen, das ist doch das wirklich interessante oder ?
Damit einher geht der alte Fehler "Stack-Overrun".
Wo wir schon dabei sind, wenn man schlecht programmiert, überschreibt man sich manchmal den Stack.

C-/C++-Quelltext

1
2
int tschuess = 1337;
return &tschuess; // (ausgesprochen "und tschüss")

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

8

22.06.2009, 23:18

Zitat

The default stack reservation size used by the linker is 1 MB

Das Betrifft meiner Meinung nach Prozesse und Threads in Windows.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Helmut

5x Contest-Sieger

Beiträge: 692

Wohnort: Bielefeld

  • Private Nachricht senden

9

22.06.2009, 23:22

Dass sich Stack und Heap entgegenwachsen war vielleicht mal so, als es nur einen einzigen verwalteten Stack im Betriebssystem gab. Heute ist das schlecht vorstellbar, jeder Prozess hat mehrere Stacks.

Wenn man in einer Funktion eine feste Anzahl an Bytes auf dem Stack haben möchte, muss auf den Stackpointer (esp) zu Beginn der Funktion nur eine konstante Zahl addiert werden (bzw. subtrahiert, weil man beim Stack von oben nach untern geht). Da für jede Funktion sowieso ein gewisser Overhead auf dem Stack gespeichert werden muss (zB Rückrufadresse) kann man die Additionen zusammenfassen. -> Keine zusätzliche Instruktion benötigt.
Solange man keine Funktionen aufruft kann man sich auch gleich das Verschieben von esp sparen und direkt auf den entsprechenden Adressraum zugreifen. Dann muss man sich aber mit Assembler schmutzig machen..

Ciao
Sei stets geduldig gegenüber Leuten, die nicht mit dir übereinstimmen. Sie haben ein Recht auf ihren Standpunkt - trotz ihrer lächerlichen Meinung. (F. Hollaender)

WhiteMike

Alter Hase

  • »WhiteMike« ist der Autor dieses Themas

Beiträge: 507

Wohnort: Ulm

Beruf: Schüler

  • Private Nachricht senden

10

22.06.2009, 23:47

Der Stack und Heap wachsen sich aber entgegen. Das ist nun mal eine Tatsache, der du auch selbst auf den Grund gehen kannst, bevor du schreibst.
Kann es sein, dass der Heap in die 1MB (unter Windows) des Stacks reinwachsen kann, wenn es sein muss und dass so ein Vorteil erreicht wird?

Und das mit der Geschwindigkeit ist sowieso aus mehreren Gründen egal.
Erstens kann die Differenz nicht so groß sein, dass es sich lohnt ein Programmkonzept zu ändern.
Zweitens ist der Begriff "zusätzliche Instruktion" an sich schon Schwachsinn. Es werden (im Idealfall) sowieso keine überflüssigen Instruktionen durchgeführt. Ist es nicht auch nur eine Operation, um auf eine beliebige RAM-Adresse zuzugreifen?

Mit freundlichen Grüßen,
WhiteMike

Werbeanzeige