Frage

Gibt es eine Sammlung, die von Shared_Ptr -Interna bekannt ist, und vermeidet regelmäßig gespeicherte Shared_Ptr -Elemente, um ihren internen schwachen Zeiger zu kopieren?

Dies bedeutet implizit, dass keine Konstruktor-/Destruktor -Anrufe durchgeführt werden und dass es keine Manipulation der Referenzzähler von Shared_Ptrs geben wird.

War es hilfreich?

Lösung

Das ist bewusst von Shared_ptr -Interna,

Das sollte Ihre Frage genau dort beantworten. Um sich der Interna zu bewusst zu sein, müsste eine solche Sammlung mit ziemlicher Sicherheit Teil von Boosts intelligenten Zeigerbibliotheken 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 durchgeführten Kopien einschränken. Die Neulokationen von Vektor werden schmerzhaft sein. Vielleicht wäre ein Deque, der eine zähte Zuteilung hat, nützlich. Denken Sie auch daran, dass Vektorimplementierungen dazu neigen, ein neues Gedächtnis bei exponentiell erhöhten Stücken zu erhalten. Sie werden also nicht alle 10 Elemente wieder zuverteilen. Stattdessen können Sie mit 128 Elementen beginnen, dann reserviert der Vektor sich 256 und bewegt sich dann bis zu 512, 1024 usw. jedes Mal, wenn das benötigt wird.

Kurz gesagt, es gibt Boosts PTR_Vector oder prealloziert Ihre Datenstrukturen mit genügend Platz, um das interne Kopieren zu verhindern.

Andere Tipps

Theoretisch werden Container nach Annahme von C ++ 0x so geändert, dass sie gegebenenfalls die Bewegungssemantik verwenden. An diesem Punkt, shared_ptr kann auch so geändert werden, dass ein Bewegungskonstruktor zur Minimierung unnötiger Referenzzahlanpassung minimiert wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top