Speicherung von Objekten oder Objektreferenzen in std::List
-
Hallo,
Welche vor-/ und nachteile bzgl. Performance und Speicherverwaltung gibt es wenn ich direkt Objekte in eine
std::listcontainer speichere oder nur deren zeiger? Vorteile bei Listen iteration??
-
Hi,
dass es beim Iterieren irgendwelche Vorteile gibt, glaube ich nicht. Das sollte bei Listen sowieso intern über Zeiger gehen.
Ansonsten sind die Vorteile bei allen StdLib_Containern:
- Objekt: Speicherverwaltung wird abgenommen, Ownership geklärt
- Zeiger: weniger Speicherplatz benötigt, Kopieren schneller, Polymorphie möglich.
Ich nutze als Default Ersteres und weiche nur dann im Einzelfall davon ab, wenn nachweislich einer der anderen 3 Punkte relevant sind.Gruß,
Simon2.
-
Simon2 schrieb:
- Zeiger: weniger Speicherplatz benötigt
??
Insgesamt wird doch mehr Speicher gebraucht: Der für den zusätzlichen Zeiger. Das Objekt muss doch immernoch erzeugt werden.
Weitere Argumente gegen Zeiger:
- zusätzliche Indirektion (knoten.objekt->datum statt knoten.objekt.datum)
- potentielle Speicherfragmentierung (zwei "new"s pro Eintrag statt eines)
-
Intern verwaltet eine list seine Objekte ohnehin über Zeiger.
-
Braunstein schrieb:
Intern verwaltet eine list seine Objekte ohnehin über Zeiger.
"Eine Indirektion mehr" sagt auch nicht, dass es vorher keine Indirektion gab

-
LordJaxom schrieb:
Simon2 schrieb:
- Zeiger: weniger Speicherplatz benötigt
??
...Hmmm, vermutlich haben wir unterschiedliche Szenarien vor Augen.
Ich meinte, dass eine "list<object>" jeweils eine zusätzliche Kopie erzeugt (man also 2 Objekte hat) und hält, während ein list<object*> nur einen zusätzlichen Zeiger hält.Gruß,
Simon2.
-
Simon2 schrieb:
Hmmm, vermutlich haben wir unterschiedliche Szenarien vor Augen.
Ich meinte, dass eine "list<object>" jeweils eine zusätzliche Kopie erzeugt (man also 2 Objekte hat) und hält, während ein list<object*> nur einen zusätzlichen Zeiger hält.Die STL-Container nutzen den Kopierkonstruktor und ja, man hat demzufolge im Moment des Kopierens ein Element mehr... Aber zumindest bei mir ist es so das, das wenn ich eine Liste fülle das Ursprungselement nur eine kurze Lebensdauer hat.
Wobei man natürlich immer im Hinterkopf behalten sollte wann eine Objektkopie teuer ist, und wann nicht.
cu André