Zum Inhalt springen

C-Heap / C-Stack


sayso

Empfohlene Beiträge

Hallo Kollegen,

bräuchte mal Infos von Euch wie Variablen im Stack bzw. Heap abgelegt werden.

1) Stack:

Variablen die ich normal mit int i oder char char[5000] anlege, werden ja auf den stack gelegt.

2)Heap:

Allokiere ich speicher mit malloc,etc. werden sie ja im Heap abgelegt.

Meine Frage ist nun:

Wieviel KB/MB kann der Stack verkraften? Denn wenn ich viele Chars mit vielen Daten habe geht er ja irgendwann zur neige. (wieviel KB/MB ist Default)

Wieviel KB/MB kann der Heap verkraften? (wieviel KB/MB ist Default)

Ich denke mal das diese Werte OS-Spezifisch sein werden, oder?

Und was passiert wenn z.B. der Stack nicht mehr aussreicht, lagert er das dann automatisch in den HEAP Bereich aus? oder spielen diese beiden Bereiche gar nicht zusammen.

Wie funktioniert das zusammenspiel der beiden? wenn ich den Speicher mit free nicht mehr freigebe, was passiert mit dem Heap der während der Programmlaufzeit allokiert wurde?

Kann ich die Defaults dafür irgendwie beim Programmstart setzen?

Ihr merkt, ich habe nicht wirklich viel Ahnung wie diese Bereiche zusammen oder ineinander spielen... wäre super wenn ihr mir hier mit links oder antworten weiterhelfen könntet :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Der Heap ist dein Arbeitsspeicher + Virtuellen Speicher. Liegt also an deinem Systemspeicher.

Der Stack ist am Start des Programms / Threads festgelegt, auf dem WinXP Rechner normalerweise 1 MB. Wenn der Stack voll ist, gibts ein Stackoverflow, sprich einen Absturz (undefinierter Zustand).

Der Stack wird auch für die Aufrufe von Funktionen verwendet und Baut sich FiLo (First in / Last out) auf. Dabei werden auch die zu übergebenden Variablen (Parameter eine Funktion) auf dem Stack gespeichert. Dabei kann es natürlich bei rekursiven Aufrufen (eine Funktion ruft sich selber auf) zu Stackoverflows kommen, wenn dies nicht begrenzt wird.

Stack ist wichtig und recht klein, also alle größeren Wünsche an den Heap richten.

Grüße,

Kristian Kratzenstein

Link zu diesem Kommentar
Auf anderen Seiten teilen

Der Heap ist dein Arbeitsspeicher + Virtuellen Speicher. Liegt also an deinem Systemspeicher.

Der Stack ist am Start des Programms / Threads festgelegt, auf dem WinXP Rechner normalerweise 1 MB. Wenn der Stack voll ist, gibts ein Stackoverflow, sprich einen Absturz (undefinierter Zustand).

Hallo,

erstmal danke für die Antwort :nett:

Kann ich die Größe des Stacks beim Programmstart bzw. Start eines Threads festlegen, wenn ja wie?

Gibt es auch eine Möglichkeit (z.B. über Debugging) herauszufinden, wieviel KB/MB das Programm/Thread zur Zeit vom Stack belegt?

Danke :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

This is compiler and system dependend.

To set the Stacksize with VC++ you could use the compiler option /F

I didn't see any debug information for current stacksize. But I didn't need that information.

But : At normal you don't get Stackoverflows, when you use for larger memoryparts (the char[1000] thing) the heap.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Sprachwirrwarr im Kopf,

Also nochmal : Stack kann mit /F unter VC++ angepasst werden (Kompileroption). Für Threads gibt es eigendlich immer Befehle.

Stackgröße hatte ich bisher nicht in den Debug informationen gesehen (andere Kompiler haben das vielleicht, vielleicht auch der VC*, weiß bloß nicht wo).

Aber der Stack sollte eigendlich kein Problem sein, wenn men damit nicht vorsätzlich verschwenderisch umgeht.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

Hallo Kollegen,

bräuchte mal Infos von Euch wie Variablen im Stack bzw. Heap abgelegt werden.

1) Stack:

Variablen die ich normal mit int i oder char char[5000] anlege, werden ja auf den stack gelegt.

Ja, sollte so sein. Allerdings ist die Größe und das Handling des Stacks vom Betriebssystem und Compiler abhängig. Unter Linux/Unix wird beispielsweise meist der Stackpointer einfach entsprechend angepasst, unter Windows wird für Konstrukte der Art

char grossesArray[1024*1024*16];

die Funktion alloca() bemüht.

Früher[tm] gab es bei vielen Systemen (auch unter Unix, beispielsweise HPUX oder Solaris) Einschränkungen bzgl. der maximalen Stackgröße eines Prozesses, die dann mittels Kernel-Parameter angepasst wurden mussten. Mittlerweile ist die Stackgröße (zumindest bei Systemen mit "ix" am Ende) meist an den verfügbaren (virtuellen) Speicher/Prozess gebunden. Unix verrät die beispielsweise mit "ps" die Größe der Stacks für die laufenden Prozesse.

Nic

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...