memcpy mit Objekten???
-
Hallo,
Kann man ein memcpy auch mit Objekten durchführen?
Würde das so aussehen?Klasse *obj_old = new Klasse [50]; // class_old wird initialisiert ... Klasse *obj_new = new Klasse [100]; // neue Klasse memcpy(obj_new,obj_old,sizeof(Klasse)*50); if(obj_old){ delete [] obj_old; obj_old = NULL; } // ... jetzt mit obj_new arbeiten ... // und nun obj_new löschen if(obj_new){ delete [] obj_new; obj_new = NULL; }
-
Theoretisch möglich, aber nicht zu empfehlen, weil eine simple Kopierung aller Elemente nicht immer korrekt ist. (Z.B. bei Zeigern)
Eine Schleife ist hier besser, die nutzt den operator=, den die Klasse entsprechend überladen hat.MfG MAV
-
Hallo,
ist aber eine Schleife nicht langsamer als memcpy? Wenn die Schleife evtl. 2Mio.x durchlaufen wird?
weitere Frage:
wenn ich memcpy trotzdem verwenden möchte. Kann ich obj_old mit malloc alloziieren, obj_new mit new???Klasse *obj_old = (Klasse*) malloc (sizeof(Klasse)*50); // class_old wird initialisiert ... Klasse *obj_new = new Klasse [100]; // neue Klasse memcpy(obj_new,obj_old,sizeof(Klasse)*50); if(obj_old){ free (obj_old); obj_old = NULL; } // ... jetzt mit obj_new arbeiten ... // und nun obj_new löschen if(obj_new){ delete [] obj_new; obj_new = NULL; }
-
ga_un schrieb:
ist aber eine Schleife nicht langsamer als memcpy? Wenn die Schleife evtl. 2Mio.x durchlaufen wird?
Nimm std::copy - aber wahrscheinlich ist memcpy schneller
Aber: memcpy liefert auch unkorrekte ergebnisse wenn du damit nicht triviale objekt kopieren willst.wenn ich memcpy trotzdem verwenden möchte.
geht nur bei trivialen objekten.
Kann ich obj_old mit malloc alloziieren, obj_new mit new???
nein.
Denn egal wie du es machst, werden entweder keine konstruktoren oder keine destruktoren aufgerufen.Warum willst du das denn überhaupt?
-
In meiner Klasse muss ich in einigen Methoden realloc verwenden, mit new ist ein "realloc" eher schwieriger zu handhaben (neuer Hilfspointer,memcpy, usw.). Ich verwende somit realloc, malloc, aber auch new.
Ich überleg jetzt grad, ob die öffentlichen Methoden für den User so zu verwenden sein sollen, das z.B. ein zurückgegebener Pointer mit delete (also C++-typisch) gelöscht werden soll. Malloc, Realloc sollen also nur intern benutzt werden:
AndereKlasse c; Klasse *obj = c.getIrgendwas(); delete [] obj;
-
Du glaubst doch nicht, dass der Compiler zu dumm ist, einen effizienten Standard-Kopierkonstruktor zu erstellen? Und wenn du einen eigenen definieren musst, dann nützt dir das memcpy() auch nichts mehr.
-
C++ unterscheidet zwischen dummen und intelligenten Objekten: POD (plain old data) und non-POD genannt. Die Definition des Unterschiedes ist recht umfangreich, aber man kann sagen, dumme Objekte bzw. POD-Objekte sind solche, die man auch in C schreiben könnte (präzise Definition -> Standard). So wie ein Objekt einen Konstruktor, Zuweisungsoperator, Destruktor oder virtuelle Funktionen hat, gilt es als intelligent. Selbstredend darf ein POD selbst auch nur aus POD bestehen (beispielsweise ist ein struct, das einen std::string enthält, automatisch auch non-POD). Da non-POD ihre Innereien kraft ihrer Intelligenz selbst zu verwalten haben, ergibt sich automatisch der Schluss, dass memcpy und andere Operationen, die ein Objekt nur als dumme Anhäufung von Bytes statt als intelligente Einheit wahrnehmen, nur auf POD-Objekte angewendet werden dürfen.
-
ga_un schrieb:
In meiner Klasse muss ich in einigen Methoden realloc verwenden, mit new ist ein "realloc" eher schwieriger zu handhaben (neuer Hilfspointer,memcpy, usw.). Ich verwende somit realloc, malloc, aber auch new.
Warum benutzt du keinen std:vector, std::list o.ä. (je nach Anwendungsfall)?
Ich finde malloc/free in C++ irgendwie deplatziert. Du musst enorm aufpassen, dass du keinen malloc-Zeiger mit delete freigibst oder einen new-Zeiger mit free. Dann doch lieber std::vector.