Gå til innhold

STL vector og memcpy


Anbefalte innlegg

Videoannonse
Annonse

Nei,

 

Alle container-klasser bruker nok dynamisk minneallokering og pekere til å lagre elementer. Ikke bruk memcpy til dette, ettersom du antakelig vil gjøre kopien korrupt ved forandring av originalen. Oftest i C++ vil du kunne bruke en overloadet operator = til dette.

 

vector<string> elems, other;
elems.push_end(string("Jodel"));
elems.push_end(string("Truddel"));
other = elems;
other.push_end(string("Foo"));
/* elems inneholder nå 2 elementer og other inneholder 3 elementer. */

Lenke til kommentar

Dette blir litt vagt, men såvidt jeg veit er det vanligste at en vector allokerer plass til 2 * vector.size() elementer når vectoren blir full, og at den opprinnelige vectoren så kopieres over. Hvis dette skjer burde vel elementene ligge etter hverandre. Men, dette regner jeg med er implementasjonsavhengig (kan ikke tenke meg at standarden sier noe om dette?). Det vil vel også forresten avhenge av allocatoren som vectoren bruker.

 

Såe, jeg ville ikke ha regna med det.

Lenke til kommentar
God dag

 

Er det noen som vet om det er mulig å kopiere elementene i en stl vector vha memcpy? dvs, ligger alle elementene kontinuerlig etter hverandre i minnet?

 

God kveld

 

Ja,

 

Svaret er et klart og høyt JA! (for std::vector)

 

vector er en dynamisk array og fungerer som en array, men tar seg også automatisk resizing når du setter inn mer enn det er plass til i arrayen. Resing skjer som regel ved at man allokerer et nytt minneområdet som har mer plass. Så pekere til data i arrayen må ikke brukes etter en reallokering, men dataene i en array går skal ligge etterhverandre. Jeg har selv bruk memcpy lignende funksjoner til å kopierer data ut og inn av vectorer. Det man må huske på er at du må ha plass til dataene du kopierer inn i en vector.

 

Vector (C++) se Replacement for arrays

 

Ha fortsatt go kveld

Lenke til kommentar
Så pekere til data i arrayen må ikke brukes etter en reallokering, men dataene i en array går skal ligge etterhverandre.

 

Er dette garantert? Og hva hvis man bruker en custom allocator?

 

Jeg har ikke c++ standarden tilgjengelig akkurat nå, men alt jeg har lært og sett tilsier at dataene ligger etterhverandre og at man ikke burde stole på pekere til elementer i en vector etter en reallokering. Man skal ikke se bort fra at man kan det, men det kommer ann på implementasjonen eller ved bruk av en custom allocator.... det blir vel det samme som ved bruk av realloc © funksjonen vil jeg tro

 

God natt alle sammen

Lenke til kommentar

Hm, dette skjønte jeg ikke helt. Benytter ikke vector seg av pekere for å allokere minne til verdiene den tar vare på og ved bruk av memcpy vil bare pekerverdiene bli kopiert og rendre selve objektet korrupt?

 

Aja, leste spørsmål litt feil. Uansett, hvis man benytter seg av memcpy til å kopiere objekter av typen std::vector direkte, vil ikke medlemmene bli kopiert. Så vidt jeg vet, er det implementasjonsavhengig om std::vector har sine elementer liggende stramt pakket i minnet, så jeg ville ikke benyttet meg av memcpy.

Endret av LostOblivion
Lenke til kommentar
<snip>

Uansett, hvis man benytter seg av memcpy til å kopiere objekter av typen std::vector direkte, vil ikke medlemmene bli kopiert.

Der er jeg helt enig med deg, man må bruke en peker til det første elementet som start og ikke en peker til vector objektet.

 

Så vidt jeg vet, er det implementasjonsavhengig om std::vector har sine elementer liggende stramt pakket i minnet, så jeg ville ikke benyttet meg av memcpy.

 

Jeg skal kikke i standarden når jeg kommer hjem, men på wiki (se link i min først post) står det

 

"Because the elements of a vector are stored contiguously,[9] "

[9] henviser til §23.2.4 Class template vector [lib.vector] para. 1 i ISO/IEC 14882:2003(E): Programming Languages - C++

 

Enten stemmer ikke wikipedia eller så leser jeg ting helt feil.

Endret av Giddion
Lenke til kommentar
<snip>

Uansett, hvis man benytter seg av memcpy til å kopiere objekter av typen std::vector direkte, vil ikke medlemmene bli kopiert.

Der er jeg helt enig med deg, man må bruke en peker til det første elementet som start og ikke en peker til vector objektet.

 

Så vidt jeg vet, er det implementasjonsavhengig om std::vector har sine elementer liggende stramt pakket i minnet, så jeg ville ikke benyttet meg av memcpy.

 

Jeg skal kikke i standarden når jeg kommer hjem, men på wiki (se link i min først post) står det

 

"Because the elements of a vector are stored contiguously,[9] "

[9] henviser til §23.2.4 Class template vector [lib.vector] para. 1 i ISO/IEC 14882:2003(E): Programming Languages - C++

 

Enten stemmer ikke wikipedia eller så leser jeg ting helt feil.

Kjekt å vite. ^^
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...