2009-06-05 16 views
5

Gibt es eine Sammlung, die Shared_ptr Internals kennt, und vermeidet regelmäßig kopieren von shared_ptr Elemente zugunsten nur ihren internen schwachen Zeiger kopieren?Sammlung spezialisiert für shared_ptr

Dies bedeutet implizit, dass keine Konstruktor-/Destruktoraufrufe ausgeführt werden und dass die Referenzzähler von shared_ptrs nicht manipuliert werden.

Antwort

3

, die bewusst Shared_ptr Einbauten ist,

, dass Ihre Frage genau dort beantworten. Um sich der Interna bewusst zu sein, müsste eine solche Sammlung mit ziemlicher Sicherheit Teil der intelligenten Zeigerbibliotheken von Boost sein. Leider gibt es so etwas nicht.

Dies ist in der Tat ein Nachteil für intelligente Zeiger. Ich würde empfehlen, Datenstrukturen zu verwenden, die die Anzahl der intern erstellten Kopien begrenzen. Die Neuzuweisungen von Vector werden schmerzhaft sein. Vielleicht wäre eine Deque, die eine chunked-basierte Zuweisung hat, nützlich. Bedenken Sie auch, dass Vektorimplementierungen dazu neigen, in exponentiell ansteigenden Blöcken neue Speicher zu erhalten. Sie verteilen also nicht alle 10 Elemente neu. Stattdessen können Sie mit 128 Elementen beginnen, dann reserviert sich der Vektor 256 und bewegt sich dann auf 512, 1024 usw. Jedes Mal verdoppeln Sie, was benötigt wird.

Kurz gesagt gibt es boost's ptr_vector oder Vorzuweisen Ihrer Datenstrukturen mit genügend Platz, um internes Kopieren zu verhindern.

9

Theoretisch werden Container nach der Übernahme von C++ 0x so modifiziert, dass sie gegebenenfalls die Bewegungssemantik verwenden. Zu diesem Zeitpunkt kann shared_ptr auch geändert werden, um einen Verschiebungskonstruktor zu haben, um unnötige Referenzzahlanpassung zu minimieren.

+2

Im C++ 0x-Entwurf hat shared_ptr bereits dieses Verhalten. –

+0

Na dann gehts los! :) – MSN

Verwandte Themen