Objekte - Heap und Stack
-
Hallo!
Ich habe mal ein paar Fragen zu Objekten. Was für Vorteile bringt es, Objekte mit new auf dem Heap anzulegen anstatt im Stack? Ich habe gelesen, dass im Heap mehr Speicher zur Verfügung steht und beim Stack das Programm nicht mehr funktionieren könnte, wenn man an die Speichergrenze kommt. Auf der anderen Seite sollen dynamisch angelegte Variablen langsamer sein. Oder packt man Objekte besser in den Stack, um mit ihm dann dessen einzelne Daten (Arrays, Structs usw.) dynamisch zu verwalten? Wann nimmt man am besten was?
Wenn ich ein Objekt auf dem Heap anlege, werden dann dessen Eigenschaften (einfache Variablen, Arrays, Structs) automatisch zusammen mit dem Objekt auf dem Heap angelegt oder muss ich sie dann noch einzeln mit new auf dem Heap anlegen?
Danke und viele Grüße
-
Hi,
Also es kommt drauf an, wenn du ein Objekt global halten möchtest ist es besser es auf den Heap zu erzeugen mittels NEW...andernfalls ist der Stack ratsamer, außer es handelt sich um große Datenmengen dann ist es auch von Vorteil das Objekt auf den Heap zu "legen"Ja wenn du ein Obejkt auf den Heap legst, werden alles Eigenschaften auch auf den Heap abgelegt
bye
-
Den Heap brauchst du im Zusammenhang mit dynamischer Speicherverwaltung. Also beispielsweise wenn die von dir erzeugten Variablen nicht am Ende des Blocks automatisch zerstört werden sollen. Du kannst mit
newunddeleteden Geburts- und Todeszeitpunkt eines Objektes selber festlegen. Ausserdem können einige Dinge gar nicht auf dem Stack geschehen, weil da die Speicherbelegung schon zur Laufzeit bekannt sein muss. Beispiel dynamische Arrays.
-
naja...
also im grunde ist der stack dem heap vorzuziehen da er einfach schneller sit
allerdings gibt es viele situationen wo der heap eifnach benötigt wird
(dynamische speicher reservierung...)dann braucht man new und somit wandert adas automatisch afu den heap
der nachteil vom heap ist die erzeugung der objekte, die braucht mehr zeit als auf dem stack
-
Hallo,
muss über 30MB einlesen und mein HEAP geht nur bis 26MB. Weiß jemand wo ich sinnvoll diese großen Datenmengen schnell ablegen kann?
Macht es überhaupt noch Sinn die Mengen in den HEAP zu schreiben?
Wenn, ja wie kann ich diesen unter QNX erweitern?DAnke für Euro Hilfe

-
Was ist das denn für eine Kombination aus Hardware/OS?
Wenn du die Daten nicht komplett in´s RAM laden kannst musst du sie halt stückweise laden und auswerten. Welche Struktur haben denn deine Daten?
-
DocShoe schrieb:
Wenn du die Daten nicht komplett in´s RAM laden kannst musst du sie halt stückweise laden und auswerten...
Und nicht wie in der Praxis schon erlebt, blauäugig komplett einlesen und auch die Analyseergebnisse bis zum Abschluss komplett im Speicher halten (das ging noch gut, als die Dateien wenige MB hatten, bis auf einmal Dateien in fast GB-Größe analysiert werden mussten, und das Analyseergebnis ca. doppelt so groß war => In Zeiten als Rechner noch üblicherweise max. 1 GB Ram hatten).
Unter Windows gibt es hierfür z.B. die Memory-Mapped Files (Man betrachtet immer nur ein Ausschnitt aus einer Datei).
-
Danke für euer schnelles Feeadback.
Ich habe ein QNX (UNIX Derivat) System mit 2G RAM
Ich brauche die kompletten 30MB zur Laufzeit im Speicher.
Ich möchte nicht während der Laufzeit das File von HD lesen.
Wäre mir alles zu langsam.Ich habe gelesen, dass der Compiler den Heap berechnet. Leider etwas schwierig wenn ich dynamisch allokiere.
Kann ich trotzdem dem Compiler eine festen Heap mitteilen - über irgendein Flag?
(GNU-Compiler)Wobei ich mir gar nicht sicher bin ob der HEAP überhaupt die richtige Stelle ist.
Evtl. wären die Daten in einem shared memory besser aufgehoben. Weitere Möglichkeiten habe ich ja unter QNX nicht oder?
Das memory mapped-file, wie bei Windows gibt es glaub ich nicht. Wobei das echt ne super Lösung wäre.
-
Ach was red ich da für dummes Zeug.
memory mapped file kann ich auch in QNX machen mit mmap() oder?
Ist ja alles POSIX *g*Ich denke, über solch einen Mechanismus sind große Datenmengen gut aufgehoben und nicht im Heap.
Was meint ihr?
-
Wenn es ein aktuelles OS ist und die HW 2GB RAM hat kann ich mir nicht vorstellen, dass der Heap nur 26MB gross ist.
Warum musst du die Daten komplett einlesen? Es wäre wirklich hilfreich, wenn du uns ein bisschen mehr über die Art und Struktur der Daten erzählst, nicht dass du hinterher nur eine CRC32 oder MD5 Hash berechnen willst
-
checkQNX schrieb:
Ich habe ein QNX (UNIX Derivat) System mit 2G RAM
Ich brauche die kompletten 30MB zur Laufzeit im Speicher.
Ich möchte nicht während der Laufzeit das File von HD lesen.
Wäre mir alles zu langsam.Ich habe keine Ahnung von QNX aber mit den mir bekannten 32 bit Linux Distributionen konnte ich immer die vollen 2^32 byte des virtuellen Speichers minus das, was vom Betriebssystem benötigt wird anfordern. In der Praxis etwa 2 GB unabhängig vom der tatsächlichen Größe des RAMs. 26MB scheint mir in jedem Fall sehr wenig zu sein.
-
Du kannst beim Starten deiner Anwendung das File auslesen und das im Heap hinterlegen oder das per mmap machen. Hängt davon ab, was du damit machen willst. Wenn du durch die Daten hindurch iterieren willst, kannst du nur das im Fokus halten, was du brauchst. Wenn du Random-Access benötigst, würde ich das im Heap hinterlegen und den Fall vorsehen, daß deine Files irgendwann zu groß werden.
Varianten gibt es viele. Auf diese Frage zu antworten ist schwer, wenn man das Problem nicht kennt :).
Gruß Kimmi
-
Also es lag nicht an der Datenmenge. Mein Heap ist grad sogar bis auf 30MB gewachsen, bis mein Prozess abstürzte.
Prinzipiell tendiere ich langsam dahin, meine großen Datenstrukturen nicht im Heap sondern in einem anderen Speicherbereich abzulegen.
Denn ich denke die Abstürze kommen von segmentation faults im Heap.
Wahrscheinlich kommen da ein paar dyn. Speicherallokierungsvorgänge durcheinander...Nur wie sieht das hard coded aus?
1. fd = open(file)
2. adr = mmap(fd)
3. structpointer = adrJetzt kann ich die Daten über "*structpointer" verwenden, ohne erneut auf die Festplatte zuzugreifen.
Ist das so richtig?
Wäre ja echt genial
-
checkQNX schrieb:
Also es lag nicht an der Datenmenge. Mein Heap ist grad sogar bis auf 30MB gewachsen, bis mein Prozess abstürzte.
Du kannst recht einfach testen ob dir der Heap Speicher ausgeht: Wenn du mit std::set_new_handler() einen handler registrierst, wird dieser aufgerufen, falls die Speicherreservierung fehlschlägt.
Der Fehler liegt aber mit Sicherheit wo anders. Bei dynamischer Speicherallokierung muss man sich natürlich mehr Gedanken machen.
-
Kannst du im Debugger sehen, ob bei deinen Zugriffen irgendwelche SEGVAULTs auftreten? Vielleicht liegt der fehler ja im Zugriff auf deine Datenstruktur. Und so ein Fehler wird auch auftreten, wenn du den Stack benutzt.
Gruß Kimmi
-
Ich habe gelesen, dass der Compiler den Heap berechnet.
Nein. Er legt eigentlich nur die Stackgroesse fest.
Mein Heap ist grad sogar bis auf 30MB gewachsen, bis mein Prozess abstürzte.
Wahrscheinlich liegt der Fehler ganz woanders.
-
Danke für die Info.
Bisher habe ich
- dynamisch Speicher allokiert
- Block gelesen
- dynamsich Speicher allokiert
- Blcok gelesen
- ...Mit mmap mach ich das alles mit einem Schritt machen.
Ich denke schon, dass das stabiler und schneller geht.
Halte euch auf dem laufenden