STL container und allocation



  • Hi,

    gibt es bei den STL containern eine Möglichkeit, dass sie immer Speicher für z.B.
    20 Objekte allokieren und bei 21 einen neuen Speicherbereich mit Platz für 40 ?

    Ich meine das ging irgendwie, aber ich scheine nach den falschen Begriffen zu suchen.
    reserve scheint ja einen festen Bereich festzulegen und dann nicht mehr Objekte anzunehmen als anfangs angegeben.

    Muss man dazu nen eigenen Allokator erstellen oder ist das gar nicht möglich?

    Danke



  • Puh...
    Mit einem eigenen Allokator geht das meinem Wissen nach nicht. Wie wäre es mit einem Adapter?



  • confused123321 schrieb:

    gibt es bei den STL containern eine Möglichkeit, dass sie immer Speicher für z.B.
    20 Objekte allokieren und bei 21 einen neuen Speicherbereich mit Platz für 40 ?

    Und dann 80, dann 160, dann 320, und immer durch Umkopieren dafür sorgen, daß die Daten in einem solchen Block hintereinander liegen? Das macht vector schon von alleine so.

    confused123321 schrieb:

    gibt es bei den STL containern eine Möglichkeit, dass sie immer Speicher für z.B.
    20 Objekte allokieren und bei 21 einen neuen Speicherbereich mit Platz für 40 ?

    Und dann 80, dann 160, dann 320, und nichts umkopieren, sodaß wenn eine list 1000000 Elemente anlegt, nur die 13 ::new-Aufrufe 80, 160, 320, 640, 1280, 2560, 5120, 10240, ..., 655360 stattfinden. Klar, das schafft ein Allokator. Schon klar, daß beim Löschen so eine fette 65536-er-Seite erst ::deletet werden kann, wenn alle Elemente daraus freigegeben wurden. Wenn nicht viel gelöscht wird, während die fast leere Liste noch viel länger weiterlebt, ist Deine Idee supi. Für meine Listen könnte ich ihn fast immer einsetzten.



  • volkard schrieb:

    confused123321 schrieb:

    gibt es bei den STL containern eine Möglichkeit, dass sie immer Speicher für z.B.
    20 Objekte allokieren und bei 21 einen neuen Speicherbereich mit Platz für 40 ?

    Und dann 80, dann 160, dann 320, und immer durch Umkopieren dafür sorgen, daß die Daten in einem solchen Block hintereinander liegen? Das macht vector schon von alleine so.

    Das macht vector von alleine? wie gebe ich ihm dann diese Zahl mit.

    z.B. bei einem vector<string> test; wie kann ich dort angeben ab wieviel Elementen er nen copy machen soll.

    Ich weiß z.B. das meist nicht mehr als 15 Objekte im vector landen. Es kann aber durchaus vorkommen, dass ausnahmsweise doch mehr reinkommen. Daher würde ich diesen Inkrement auf 15 setzen.



  • confused123321 schrieb:

    z.B. bei einem vector<string> test; wie kann ich dort angeben ab wieviel Elementen er nen copy machen soll. Daher würde ich diesen Inkrement auf 15 setzen.

    Nein! Nicht das Inkrement auf 15. Also nicht 15, 30, 45, 60, 75, ..., 15000, das würde ewig dauern!
    Besser 15, 30, 60, 120, ..., also immer verdoppeln. Und genau das macht vector. Ok, nicht versprochen, daß er verdoppelt, aber versprochen, daß er vergleichbar schnell ist. Kannst davon ausgehen, daß er verdoppelt, denke ich.

    Fang einfach mit 15 als Konstruktorargument oder reserve an. Der Rest geht automagisch.

    Das Wichtigste dann ist, daß Du den vector mit wiederholten AUfrufen von push_back füllst und nicht mit [] reinschreibst. Dadurch weiß er, wie voll er ist und wann er wachsen soll.



  • habe mir mal ein Testbeispiel gemacht.

    Hatte wohl in meinem Prog einen anderen Bock geschossen, als ich das reserve eingebaut hatte.
    Dachte dadurch, dass bei reserve eine feste Größe allokiert wird und dann nicht mehr in den vector passt. (was ja auch Schwachsinn wäre beim vector) Dabei habe
    ich das aber auch zu 100% früher schonmal verwendet.

    Ich brauche wohl Urlaub 🙂

    Jetzt weiß ich aber auch wie das intern in etwa funktioniert. Danke !!!


Log in to reply