2009-07-10 10 views
2

Wie verwalten Menschen normalerweise das Kopieren einer Liste großer Objekte?C++ Speichern großer Daten in std :: list <> .. sollte ich Referenzzählung verwenden?

Hier ist meine Situation:

Zur Zeit habe ich dies:

typedef std::vector<float> Image; 

und ich bin zu speichern es in einem

std::list<Image> lst; 

Die Image.Size() ist recht groß (jeweils ist ~ 3-5 MB).

Ich bin vorbei (kopieren) die Liste herum.

Ist es ein richtiges Verständnis von mir, dass std :: vector jedes Element nach Wert kopiert? Wenn ja, könnte die Performance aufgrund exzessiven Kopierens etwas schlecht sein?

Was kann ich tun, um das Kopieren zu minimieren? Sollte ich stattdessen

std::list<ImageRef> lst; 

wo

typedef boost::shared_ptr<Image> ImageRef; 

?

Was ist die elegante Art, mit dieser Art von Problem umzugehen?

+3

Ich denke, dass Sie Ihre eigene Frage beantwortet haben, indem Sie eine schöne, elegante Art der Behandlung des Problems gegeben haben. Die shared_ptr <> Technik ist fast sicher der Weg zu gehen. –

Antwort

5

Objekte, die größer als eingebaute Typen sind, sind meistens viel billiger, um durch Referenz als durch Wert herumzugehen. Wenn dein Objekt also etwa 3 Megabyte groß ist und du es weitergeben musst, bitte kopiere es nicht!

Alle STL-Typen verwenden Wert Semantik: Sie kopieren ihren Inhalt. Beachten Sie, dass der Inhalt möglicherweise aus Zeigern besteht. In diesem Fall werden die Zeiger kopiert, nicht was sie bedeuten.

Es kann sogar eine gute Idee sein, Ihre Bildliste als Referenz zu übergeben. Spart viel Smart-Pointer-Kopieren, spart also viel Referenz-Count-Management und kann viele Sperren/Freischaltungen speichern.

3

Ich denke, die boost::shared_ptr Route ist ein guter Ansatz, solange es nicht darauf ankommt, dass die Image s nicht kopiert werden, wenn die Liste kopiert wird. Sie werden das Kopieren minimieren, aber die Referenzzählung wird auch für Sie sauber machen, wenn die letzte Liste zerstört wird.

1

Zuerst würde ich

typedef std::list<Image> ImageList; 

Wenn Sie nur mit der einer Liste arbeiten müssen, es zu manipulieren, übergibt Verweise auf eine Abbildungsliste selbst. Keine Notwendigkeit, etwas auf diese Weise zu kopieren. Wenn Sie die ursprüngliche Liste beibehalten und Kopien davon erstellen müssen, ist boost :: shared_ptr der richtige Weg.

2

Nicht für den Blick in den Boost pointer container. Kopieren boost :: shared_ptr ist billig, aber nicht so billig. Ref zählen ist auch nicht kostenlos. Wenn Sie viel kopieren und kein einzelnes Image-Objekt freigeben müssen, sind Boost-Pointer-Container der bessere Weg.