PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++ : wann Stack, wann Heap


Gast
2008-03-28, 13:34:51
hallo

wann sollte man ein Objekt auf dem Heap anlegen, wann auf dem Stack? Sollte man immer, wenn man es auf dem Stack anlegen kann, auch dort machen? (und sonst keine Probleme mit den Eigenschaft des einen oder anderen hat)

Habe auch mal irgendwo gelesen, daß Stackoperation schneller seinen sollen. Soll man den eher den Stack benutzen, um ein new zu sparen; oder gibt es andere Gründe? danke

Gast
2008-03-28, 14:11:46
Crossposting http://www.c-plusplus.de/forum/viewtopic-var-t-is-209261.html

Bitte klosen!

Gnafoo
2008-03-28, 14:24:19
Der Stack ist in der Größe begrenzt und Objekte die auf dem Stack liegen sind an ihren Gültigkeitsbereich gebunden. D. h. Parameter werden nach Verlassen einer Funktion wieder ungültig und Objekte die man ohne new erstellt hat ebenso.

Das ist vermutlich indirekt auch das, worauf du mit den "schnelleren Stackoperationen" anspielst. Erstellst du ein Objekt mit new, reicht es aus, einen Zeiger zu übergeben. Da das Objekt nicht automatisch zerstört wird, bleibt der Zeiger gültig, bis man das Objekt explizit zerstört. Ein Zeiger auf ein Objekt, welches du ohne new erstellt hast, wird ungültig, wenn du den Gültigkeitsbereich des Objektes verlässt. Übergibt man das Objekt allerdings nicht als Zeiger, dann wird es immer wieder kopiert, was langsamer ist. Mit Referenzen lässt sich hier allerdings Abhilfe schaffen (solange man den Einflussbereich nicht verlässt).

Ansonsten sind Objektzugriffe gleich schnell, egal ob im Heap oder im Stack. Okay ich könnte mir vorstellen, dass der Stack einen kleinen Vorteil hat, weil die Daten eher im Cache liegen könnten und die Adresszuordnungen eher im TLB zu finden sind. Schließlich wird der Stack spätestens mit jedem Funktionsaufruf benötigt (sofern nicht inlined). Aber das sollte man wohl vernachlässigen können, solange man nicht das letzte Stück Performance aus seinen Codezeilen quetschen muss.

Also als Faustregel würde ich sagen: wenn du das Objekt außerhalb seines gewöhnlichen Gültigkeitsbereich bzw. in weiten Teilen des Programms brauchst: auf den Heap damit und Zeiger übergeben. Brauchst du das Objekt nur in einer Funktion, kannst du es getrost auf dem Stack lassen. Hat auch den Vorteil, dass es automatisch wieder zerstört wird. Musst du dabei das Objekt an andere Funktionen übergeben, kannst du auf eine Referenz ausweichen. Diese vermeidet das Kopieren des Objektes.