Speicherplatz eine std::vectors



  • Wieviel Byte /Kbyte würde dieser Vector im Speicher benötigen?

    std::vector<std::pair<CWorkEvent*,CWorkEvent*> > data(128,std::pair<CWorkEvent*,CWorkEvent*>(NULL,NULL));
    

    ein Pointer hat ja 4Byte, davon ein Pair sind 8 Byte und das ganze
    128 mal sind 1Kbyte ... ist das möglich.. oder kommt da noch ne menge byte an Overhead hinzu?



  • Ein pair benötigt Platz für seine Elemente - also hier 2*sizeof(CWorkEvent*), dazu kommt im vector noch Platz für 2..3 Hilfszeiger und/oder -ints, also insgesamt ca. 128*2*sizeof(CWorkEvent*)+3*sizeof(void*). Bei einer Größe von 4 Byte für Zeiger hast du also 1036 Byte (etwas über ein KB).

    Aber der vector kann seine Kapazität auch prophylaktisch etwas größer ansetzen, was zusätzlich Platz benötigt.



  • dazu faellt mir grad ein,
    braucht ein vector den speicherplatz am stueck?



  • Den Platz für die Nutzdaten ja (ist afaik im Standard festgelegt, aber frag mich jetzt nicht nach dem entsprechenden Paragraphen). Der Platz für die internen Daten liegt extra (und ist klein genug, um auf den Stack zu passen).



  • und nochmal zu reserve:

    std::vector<std::pair<CWorkEvent*,CWorkEvent*> > data(1,std::pair<CWorkEvent*,CWorkEvent*>(NULL,NULL));
    
    data.reserve(128);
    

    der Vector braucht nun trozdem ca. 1036kb?



  • Ja, mindestens. reserve(cap) legt genug Platz an, um (irgendwann später) mindestens cap Elemente unterbringen zu können.



  • hmm dann ist es ja in diesem Fall egal, ob ich den vector direkt mit der größe anlege oder nich.. nachteil ist halt das er den ganzen vector komplett iterieren muss, auch wenn nur 3 elemente verwendent werden:)



  • Wer muß den Vector iterieren? Wenn du nur drei Elemente hast, aber Platz für 100 reserviert hast, sind die übrigen 97*sizeof(T) Bytes nicht-initialisierter Datenmüll, der erst bei Bedarf aufgefüllt wird.



  • Der einzige Vorteil, den dir reserve() in dem Fall liefern kann ist der, dass sich der vector dann einmalig den nötigen Speicher unter den Nagel reißt und seine Elemente dort hinein umkopiert. Wenn du auf reserve() verzichtest und mit einerm Haufen push_backs nach und nach Elemente hinzufügst, wird er jedesmal, wenn die Kapazität überschritten wird, sich einen größeren Speicherblock reservieren und alles umkopieren müssen.

    Dass der Speicher für die Nutzdaten am Stück sein muss, ist soweit afair dadurch festgelegt, dass laut Standard &v[i] = &v[0] + i sein muss.


Anmelden zum Antworten