Element aus Vektor löschen und Speicher freigeben



  • wx++ schrieb:

    Wenn du große Objekte speicherst und der Vektor oft umkopiert wird (z.B. durch wahlfreies Löschen), ist die Heap-Variante aber wieder deutlich schneller.

    In so einem Fall könnte man sich Gedanken über eine std::list machen.



  • Diese Schleife, in der Du test1.erase(...) aufrufst, ist sinnfrei. Ein einfaches test1.clear(); tut es auch.

    Wenn deine Objekte aber im wirklichen Programm "komplex" sind (im Sinne eines zeitaufwändigen Kopierkonstruktors), kannst Du ja auch mal std::deque statt std::vector probieren. Wenn ich mich da nicht vertue, dürfte man sich mit einer deque beim Wachsen einiges an Kopierarbeit sparen. Die Komplexitätsklasse beim push_back ist zwar in beiden Fällen die gleiche, aber ich kann mir vorstellen, dass der Faktor ein anderer ist. Der Extremfall ist dann std::list. Aber damit verlierst Du dann den "random access".

    lg,
    k



  • wx++ schrieb:

    Wenn du große Objekte speicherst und der Vektor oft umkopiert wird (z.B. durch wahlfreies Löschen), ist die Heap-Variante aber wieder deutlich schneller.

    In der Regel nicht mal das, dazu müssten die Objekte sehr groß sein. Grade im konrekten Fall ist der Unterschied zwischen einem 4-Byte-Pointer und einem 8-Byte-double minimal im Vergleich zum Allokationsoverhead.
    Vielmehr ist die Faustregel, wann immer möglich zuerst die Variante ohne Zeiger probieren (einfacher, sicherer, in der Regel performanter) und erst wenn sich das als Performancebottenleck herausstellen sollte probieren, ob es mit Zeigern schneller geht.



  • wx++ schrieb:

    Wenn du große Objekte speicherst und der Vektor oft umkopiert wird (z.B. durch wahlfreies Löschen), ist die Heap-Variante aber wieder deutlich schneller.

    Ja, aber bevor man dann sämtliche Nachteile manueller Speicherverwaltung in Kauf nimmt, kann man auch über Alternativen nachdenken. Abgesehen von anderen Containertypen kann man z.B. mit swap() einige Kopien vermeiden. Insbesondere ist damit auch eine Löschung aus std::vector in O(1) möglich, sofern die Reihenfolge unwichtig ist.



  • Hallo Krümelkacker

    Diese Schleife, in der Du test1.erase(...) aufrufst, ist sinnfrei

    Ja, aber nur in seinem Beispiel und nicht im richtigen Leben 😉

    Herzliche Grüsse
    Walter



  • snOOfy schrieb:

    @Tachyon: 2GB verbraucht es nicht hier im Beispiel sondern in meinem richtigen Programm, in dem die Elemente des Vektors Instanzen einer deutlich komplexeren Klasse sind.

    Aha, und an Hand eines Beispiels, was den Fehler nicht produziert, sollen wir jetzt feststellen, warum der Code, den du uns nie gezeigt hast, so viel Speicher frisst? Ein kleines Analogon:

    A: "Hilfe ich hab Probleme, ich kann meine Mathehausaufgaben nicht rechnen. Beispiel: 1+1. Kann mir jemand helfen?"
    B: "1+1 ist 2, wo ist das Problem?"
    A: "Ja 1+1 war ja nur ein Beispiel, meine Hausaufgaben sind viel schwieriger."

    Was ich damit sagen will: Nimm deinen Originalcode und reduziere ihn aufs Wesentliche. Das erreichst du, indem du schrittweise unbedeutende Teile auskommentierst und dann guckst ob das Problem noch besteht. Wenns weg ist, hast du die Ursache auskommentiert. Wenn du dann alles auf ~50 Zeilen gekürzt hast stellst du den Code so wie er ist hier ins Forum. Nur so kann man dir auch sagen, wo das Problem liegt.



  • Hier hätte es doch auch die 2GB erreicht, wenn ich statt der 2 Millionen eine noch größere Zahl eingesetzt hätte. Die Frage war ja nicht, warum es die 2GB erreicht und abstürzt, sondern warum es überhaupt mehr wird. Und das wurde hier mit Hilfe meines Beispiels beantwortet, so dass ich mein Problem nun gelöst habe 🙂


Anmelden zum Antworten