[ein.brot in Not] -> Dyn. Mem. zur Laufzeit weiteren allozieren



  • Hi,
    hätte jemand eine Idee wie ich Speicherschonend in Sauberem C++ ein dynamisch erzeugtes Array [muss auch eine Klasse sein können, also fällt realloc etwas in den hintergrund...] zur laufzeit vergrößern kann.

    Ich hab nachgeforscht und es wurde empfohlen, entweder ein temp array mit dem alten inhalt zu erzeugen und dann ein neues mit der entsprechend größeren länge, und dann zu kopieren.
    Gut, aber das ist bei großen Arrays nicht wirklich Speicherschonend.

    Weiter unten im Text stand dann man solle auf die STl ausweichen, sprich vector.
    Das doofe daran mir wurde verboten vector zu benutzen... sprich, selber schreiben...
    Ich hab gelesen stl::vector benutzt "raw memory"... nur mehr hab ich dazu leider noch nicht in erfahrung bringen können.

    Hat wer eine Idee?
    Oder was hilfreiches zu raw memory?
    oder nen codebruchstück aus der stl::vector?
    irgendwas? *g

    das zutiefst ergebene brot 🙂



  • ein.brot schrieb:

    Ich hab nachgeforscht und es wurde empfohlen, entweder ein temp array mit dem alten inhalt zu erzeugen und dann ein neues mit der entsprechend größeren länge, und dann zu kopieren.

    fast gut.
    besser, du erzeugst ein temp-array mit der größeren große und kopierst in das temp-array und vertauscht dann einfach die zeiger von deinem und dem temp-array. so mußte beim verdoppeln der größe nur einmal kopieren. und zum vertausendfachen der größe nur 10-mal kopieren. mit insgesamt nur sovielene elementkopien, wie das array nach dem wachsen für ne größe hat, also durchaus relativ billig. billiger als verkettete listen.

    was vector noch zusätzlich macht, ist daß er beim anlegen des speichers nicht alle speicherzellen initialisiert (konstruktor aufruft), sondern sich mit nem zeiger merkt, bis wohin bereits inistialisiert wurde. und bei pushback hupft der zeiger halt eins weiter. siehe "placement new", wie das genau funktioniert.



  • ein.brot schrieb:

    ein temp array mit dem alten inhalt zu erzeugen und dann ein neues mit der entsprechend größeren länge, und dann zu kopieren.

    umständlich. neues array mit der benötigten größe erstellen. alten inhalt reinkopieren. altes array löschen.

    Gut, aber das ist bei großen Arrays nicht wirklich Speicherschonend.

    du kannst auch ein bisschen mehr, "auf vorrat" allozieren. dann muss nicht so oft umkopiert werden.

    Das doofe daran mir wurde verboten vector zu benutzen

    nimm ::std::list. oder ::std::deque. 😉



  • doppelmuffe schrieb:

    umständlich. neues array mit der benötigten größe erstellen. alten inhalt reinkopieren. altes array löschen.

    ja, so hab ichs auch gelesen und gemeint, sry, vertippelt 🙄

    doppelmuffe schrieb:

    du kannst auch ein bisschen mehr, "auf vorrat" allozieren. dann muss nicht so oft umkopiert werden.

    dafür würde ich geköpft werden 😉

    doppelmuffe schrieb:

    nimm ::std::list. oder ::std::deque. 😉

    😉 ja ne is klar 😛

    *mir grad volkards durchles und ma recharchier*



  • ein.brot schrieb:

    doppelmuffe schrieb:

    du kannst auch ein bisschen mehr, "auf vorrat" allozieren. dann muss nicht so oft umkopiert werden.

    dafür würde ich geköpft werden 😉

    willst du dynamisch zur leufzeit die objekte einzeln reistopfen können? dann ist auf-vorrat-allokieren ein toller weg.



  • ich möchte, ein Feld dynamisch erzeugen, dessen größe man während der laufzeit beliebig verändern kann. Dabei aber keine Grenzen [außer Ram größe, etc.] hat.

    Aber es soll am besten keinen unnötigen Speicher verbrauchen.
    Also fällt vor allozieren oder etwas mehr im voraus flach.

    [EDIT]

    ich kämpf mich grad durch die stl::vector dateien...
    aber was ich bis jetz hier entziffere kopieren die da auch wild umher...


Anmelden zum Antworten