speicher "aggressiv" freigeben
-
ich hab ne datenstruktur, die aus vielen redundanten zeigern besteht. dadurch sollen paar berechnungen ram statt cpu intensiv werden.
also ungefähr so:
struct A { float payload; vector<B*> b_; vector<C*> c_; } struct B { float payload; vector<A*> a_; vector<C*> c_; } struct C { vector<A*> a_; vector<B*> b_; vector<C*> c_; }so eine struktur wird für eine berechnung temporär angelegt und frisst so ca. 1 gig ram weg. nach der berechnung wollt ich das ding wegschmeissen, aber irgendwie wird der speicher nicht frei gegeben.
ist "delete" für sowas geeignet oder muss man den speicher dann anders wieder freigeben?
-
delete ist dafür geeignet, wenn der speicher mit new reserviert wurde.
-
Hallo
aber nicht vergessen, das du bei den vectoren wegen der Pointer selbst die dahinter stehenden Instanzen mit delete löschen must.
Das ganze kannst du dir übrigens durch die Verwendung von Destruktoren für die structs vereinfachen.bis bald
akari
-
da fällt mir noch was ein. einige der container sind sets und so krams, die ich über iterator anspreche. iterator liefern ja konstante zeiger zurück, kann man über die mit delete die instanz zerstören?
-
wäre ziemlich dumm wenn man ein "const char* p = new char[13];" nicht wieder löschen könnte...
-
Wenn deine Bs und Cs klein sind, kannst du kannst einen Arena Allocator (auch Pool Allocator, Cluster Allocator) dafür verwenden: der alloziert Speicher in großen Blöcken, gibt den in kleinen Schnipsel raus (ohne sich zu den Schnipsel irgendwas zu merken). Wenn du das ganze nicht mehr brauchst, gibst du nur die paar Blöcke frei.
Spart Speicher (typisch 8Byte overhead / Alloc), vermeidet Heap-Fragmentierung.
(Die Allokationen sollten allerdings das "richtige" alignment für die entsprechenden daten haben, sonst wirst du zu langsam)
wenn es nicht allzuviele B's und C's sind, kannst du bei delete bleiben.
Ob das ganze aber wirklich eine Optimierung ist, sei dahingestellt. Speicherzugriffe sind auf modernen Rechnern der Flaschenhals schlechthin. Wenn du den Speicher sequentiell durchforstest, mag es noch gehen, wenn du aber auf dem 1GB wie wild rumhüpfst, ist der Prozessor nur mit Warten beschäftigt.