memcpy mit vector Array



  • Ich habe eine Funktion die ein C-Array mit memcpy nutzt. Ich würde diese gerne auf ein vector array umstellen.

    Dabei stellt sich mir die Frage ob ich dann memcpy nutzen kann und wenn nicht (was ich mal denke) dann wie ich dann ein vector array in ein anderes kopiere und wie schnell das im Vergleich zu memcpy ist.

    Matthias



  • memcpy() kannst du nicht verwenden, aber dafür hat vector<> einen Copy-Ctor und op= (beide für die Kopie aus einem anderen vector<>) sowie einen Ctor, der einen Iterator-Bereich entgegennehmen kann (geeignet für jeden Container mit eingebauter Iterator-Unterstüzung).



  • CStoll schrieb:

    memcpy() kannst du nicht verwenden, aber dafür hat vector<> einen Copy-Ctor und op= (beide für die Kopie aus einem anderen vector<>) sowie einen Ctor, der einen Iterator-Bereich entgegennehmen kann (geeignet für jeden Container mit eingebauter Iterator-Unterstüzung).

    Und wie verhält sich das bzgl der Geschwindigkeit? Zu memcpy habe ich im Netz nur gelesen das man es wegen der überragenden Geschwindigkeit wählt.

    Matthias



  • Das ist etwas schwierig abzuschätzen - die vector<> Konstruktoren haben auf jeden Fall O(n) Laufzeit, aber sie könnten etwas langsamer sein als memcpy() (wegen fehlender Optimierungsmöglichkeiten).
    (im Zweifelsfall hilft nur eins: benötigte Zeit stoppen - und feststellen, ob die Kopiererei wirklich der Engpass des Programms ist)

    Der springende Punkt ist ganz einfach, daß die C Speicherverwaltung von unstrukturierten Daten ausgeht - memcpy() hat keine Ahnung von Copy-Konstruktoren oder Zuweisungsoperatoren, wodurch du dir recht schnell deine Daten pulverisieren kannst:

    string data1 = "Hallo Welt";
    string data2;
    memcpy(data2,data1,sizeof(string));//BUMM
    

    (normalerweise wird durch das Zusammenspiel von Copy-Ctor, op= und Dtor sichergestellt, daß jeder String weiß, wem die Zeichendaten gehören (egal ob per Referenzzählung oder als tiefe Kopie). memcpy() funkt hier dazwischen, indem es eine flache Kopie erzeugt - also versuchen letztendlich beide Strings, mit den selben Daten zu arbeiten (und das ohne voneinander zu wissen). Der Aufruf wird noch problemlos funktionieren, aber spätestens im Dtor von data1 fliegt dir eine Access Violation um die Ohren.



  • pospiech schrieb:

    CStoll schrieb:

    memcpy() kannst du nicht verwenden, aber dafür hat vector<> einen Copy-Ctor und op= (beide für die Kopie aus einem anderen vector<>) sowie einen Ctor, der einen Iterator-Bereich entgegennehmen kann (geeignet für jeden Container mit eingebauter Iterator-Unterstüzung).

    Und wie verhält sich das bzgl der Geschwindigkeit?

    Das ist abhängig von der gewählten STL-Implementation. Im Zweifelsfall hilft messen mehr als spekulieren.



  • Laut diesem Thread http://www.c-plusplus.net/forum/viewtopic-var-t-is-180883.html
    und meinen Erfahrungen 😉 liegen die Elemente in einem Vector doch aber hintereinander. Ergo koennte man doch auch memcpy nutzen, um eine Kopie zu erzeugen oder? (natuerlich besser nur für Typen ohne Konstrutor).

    vector<int> v1;
    v1.push_back(1);
    v1.push_back(2);
    v1.push_back(3);
    v1.push_back(4);
    
    vector<int> v2;
    v2.resize(v1.size());
    memcpy(&v1[0], &v2[0], v1.size() * sizeof(int));
    

    Ungetestet. Aber prinzipiell richtig oder falsch?

    Gruss,
    DeSoVoDaMu



  • Jup, solange der Elementtyp T per memcpy kopierbar ist, geht das. Bevor man sowas macht, sollte man aber prüfen, ob es in der konkreten Situation auch irgendwas bringt. Ansonsten ist ne simple Zuweisung bzw. ein range-insert schlicht hübscher.


Anmelden zum Antworten