Dauer bei Objekterzeugung?
-
Folgende Klasse:
class XXX std::vector<std::pair<CWorkEvent*,CWorkEvent*> > m_vRelationship; XXX(UINT iSize): m_vRelationship(iSize,std::pair<CWorkEvent*,CWorkEvent*>(NULL,NULL){ } };wenn ich nun ein Objekt der Klasse bspw 10, 80, 160 Elementen erzeuge und von den objekten mehrere hundert in einer for-schleife, geht das rel. lange? Wie könnte ich das optimieren? Da die Vectorgröße jede objekt gleich ist, könnte ich doch ein objekt erzeugen und memcpy verwenden?
EDIT:
Zudem speicher ich die XXX Objekte in einer std::list.. durch das push_back wird, ja das Objekt ja nochmal in die liste kopiert und das alte gelöscht!
-
Das mit dem memcopy vergesse mal ganz schnell wieder... sowas ist beim Hantieren mit Objekten tabu.
Ansonsten stellt sich mir die Frage was du mit 10, 80, 160 identischen riesen Strukturen anfangen willst... die hat den gleichen Informationsgehalt wie in einem dieser Objekte.
Erstmal Strukturen aufbauen, die man eventuell später mal gebraucht ist kein gutes Vorgehen. Baue die Strukturen erst dann auf wenn du sie auch mit sinnvollen Daten füllst, dann stellt sich die Frage gar nicht.
-
std::vector<std::pair<CWorkEvent*,CWorkEvent*> > m_vRelationship;Zumal du hier nichts weiter in deinem std::vector speicherst, als Objekt-Zeiger und deren Länge ist ein Prozessorregister (meistens). Das Kopieren von Zeigern ist nun wirklich kein Großer Akt. Es spielt ja keine Rolle ob das Objekt, auf welches der Zeiger gerichtet ist nun 16 bytes oder 2 MiB groß ist.
In Deinem Fall sind 160 Objekte (genauer Objekt-Zeiger) nun wirklich kein großer Aufwand für den Rechner. Hier kann man zwischendurch auch ruhig mal den kompletten std::vector kopieren (mit dem Kopier-Konstruktor von std::vector versteht sich).
Grüße...
Heiko
-
Boris! Du hast anscheinend immer noch nicht verstanden was Pointer sind? Und anscheinend nicht was vector<typ*> bedeutet?
Das Kopieren deines Beispiels wird einen heutigen Prozessor wahrscheinlich langweilen. "Wie? Ich soll 160 x 32 bit umkopieren? Das mache ich nebenbei bzw. das erledigt DMA."
-
woher soll ich wissen wie schneller der PC für 640byte brauch zum kopieren? was hat das damit zu tun ob ich nicht weis was ein pointer ist und was ein Objekt?
wir reden hier die ganze zeit von einem 640byte großem objekt.. wieso sollte ich den zeiger kopieren wollen??
-
BorisDieKlinge schrieb:
wir reden hier die ganze zeit von einem 640byte großem objekt.. wieso sollte ich den zeiger kopieren wollen??
Weil im OP nur Zeiger Deiner Objekte vorkommen? Weil Du nach "wenn ich nun ein Objekt der Klasse bspw 10, 80, 160 Elementen erzeuge und von den objekten mehrere hundert in einer for-schleife, geht das rel. lange?" fragst? Wenn Du es so meinst wie Du es fragst, willst Du also 160 dieser Pairs erzeugen und in den Vector kopieren?
Also entweder Du stellst verständliche Fragen oder lieferst aussagekräftigen, relevanten Code, oder am besten gleich beides.

-
Für mich ist dieser vector welcher 320 Zeiger enthält ein Objekt mit 640byte...
-
BorisDieKlinge schrieb:
Für mich ist dieser vector welcher 320 Zeiger enthält ein Objekt mit 640byte...
Ach, Du willst von DIESEM Objekt (Klasse XXX), welches den Vector enthält, XX Elemente erzeugen? Warum schreibst Du das dann nicht?
-
Ja das will er...
-
BorisDieKlinge schrieb:
Folgende Klasse:
class XXX std::vector<std::pair<CWorkEvent*,CWorkEvent*> > m_vRelationship; XXX(UINT iSize): m_vRelationship(iSize,std::pair<CWorkEvent*,CWorkEvent*>(NULL,NULL){ } };Wenn ich das richtig interpretiere fehlen da ein bis zwei geschweifte KLammern und du definierst hier eine Klasse XXX, die einen vector als Member hat, richtig?
(Kleine Anmerkung: gib deinen Klassen Aussagekraeftige Namen, XX gehoert nicht dazu. Und solltest du den Namen extra fuers Forum veraendert haben - wozu? Lass es doch einfach wie es war, wird schon kein streng geheimes Regierungsprojekt sein oder?)wenn ich nun ein Objekt der Klasse bspw 10, 80, 160 Elementen erzeuge und von den objekten mehrere hundert in einer for-schleife, geht das rel. lange?
Die Frage ist recht unverstaendlich, unter anderem weil du nicht sagst, welche Klasse du meinst, weil du erst von einem dann von mehreren hundert Objekten sprichst und weil "wenn ich ein Objekt 10 Elementen erzeuge" kein verstaendlicher Satz ist. Ich vermute mal, du willst wissen, ob es langsam ist, mehrere hundert XXX-Objekte mit jeweils 10/80/160 Elementen im vector zu erzeugen. Antwort: ja, es ist relativ langsam (Im Vergleich zu ner einfachen Addition z.B.) - und nein, es ist nicht langsam (im Vergleich zum Hochfahren des Rechners oder zum Kaffeekochen oder wie auch immer) - sollte relativ fix gehn weil wie schon geschrieben wurde pro XXX-Objekt nur 10/80/160 * 2 * sizeof(CWorkEvent*) byte mir nullen initialisiert werden muss.
Wie könnte ich das optimieren?
Erstmal am besten garnicht. Erstmal ist der Code so am besten, wie er fuer dich als Entwickler am schnellsten verstanden ist. Es bringt bestenfalls garnichts, schon im Entwurfsstadium zu optimieren, schlimmstenfalls laesst man sich irgendwelchen kryptischen Hack-Code mit irgendwelchen bugs einfallen, die man nicht ohne weiteres findet weil der code so kryptisch ist. Wenn du am Ende meinst, noch optimieren zu muessen, dann lass einen Profiler laufen, der dir sagt wo du am Besten was rausholen kannst. Aus dem Bauch raus zu optimieren bringts nicht wirklich.
Da die Vectorgröße jede objekt gleich ist, könnte ich doch ein objekt erzeugen und memcpy verwenden?
Nein. Auf keinen Fall. Objekte erzeugt man mit einem Konstruktor, der den "rohen" Speicher initialisiert. Mit memcpy kopierst du Daten aus einem Speicherbereich in einen anderen, ohne Typsicherheit usw. Mal abgesehen davon, dass dein vector intern Speicher mit Zeigern verwaltet, die du mitkopieren wuerdest. Deine Objekte (bzw. die vectoren darin) wuerden alle den gleichen Speicher verwalten und als ihren Besitz betrachten - Katastrophe.
EDIT:
Zudem speicher ich die XXX Objekte in einer std::list.. durch das push_back wird, ja das Objekt ja nochmal in die liste kopiert und das alte gelöscht!Ja. Und? Das gibt dir vielleicht einen Loesungshinweis auf deine vorherige Frage - du koenntest ein Objekt erstellen und das mit mehreren push_backs n-fach in die Liste einsetzen, bzw. Kopien davon. Was auch immer du dann mit hunderten vectoren voll mit je 320 NULL-pointern anstellen willst...