Gibt es Nachteile bei der Verwendung von make_shared zum Erstellen eines shared_ptr?
Gibt es Nachteile mit der Verwendung von make_shared<T>()
anstatt shared_ptr<T>(new T)
.
Boost-Dokumentation Staaten
Gab es wiederholt Anfragen von
Benutzer für eine factory-Funktion, die
erstellt ein Objekt eines bestimmten Typs und
gibt einen shared_ptr. Neben
Komfort und Stil, so eine Funktion
ist auch die Ausnahme und sicher
deutlich schneller, da es verwenden kann
eine einzelne Zuweisung für die beiden
Objekt und der entsprechenden Steuerung
block, wodurch eine erhebliche
Teil von shared_ptr Bau
overhead. Dies beseitigt eine der
große Effizienz-Beschwerden über
shared_ptr.
Kommentar zu dem Problem - Öffnen
Man mag sich Fragen, was sind die anderen großen Wirkungsgrad Beschwerden über shared_ptr?
Ausnahme Sicherheit ist eine ziemlich starke asset von
std::make_shared
. Versuchen Sie, es zu benutzen, Wann immer möglich. @ViktorSehr Mutex locks auf den Referenz-Zähler, wenn ein
shared_ptr
kopiert wird hauptsächlich 🙂 @Drax: Ah, also Sie sind thread-sicher? Wusste nicht, dass
@Drax Dont mind the questionmark btw, kann ich von google 🙂
InformationsquelleAutor der Frage Tobias Furuholm | 2010-01-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich kenne mindestens zwei.
Ziemlich schwache Punkte. so versuchen immer make_shared.
InformationsquelleAutor der Antwort deft_code
Zusätzlich zu den Punkten, präsentiert von @deft_code, eine noch schwächere:
weak_ptr
s, das Leben nach all denshared_ptr
s zu einem bestimmten Objekt haben, gestorben, dann ist dieses Objekt der Erinnerung wird Leben im Gedächtnis zusammen mit der control-block, bis der Letzte weak_ptr stirbt. In anderen Worten wird das Objekt zerstört, aber nicht freigegeben, bis das Letzteweak_ptr
zerstört wird.InformationsquelleAutor der Antwort sbk
Vom http://www.codesynthesis.com/~boris/blog/2010/05/24/smart-Pointer-in-boost-tr1-cxx-x0/
Der andere Nachteil der make_shared () - Implementierung ist der Anstieg in den Objekt-code-Größe. Aufgrund der Art, wie diese Optimierung umgesetzt wird, ist eine zusätzliche virtuelle Tabelle, sowie eine Reihe von virtuellen Funktionen instanziiert werden für jeden Objekttyp, den Sie verwenden, mit make_shared().
InformationsquelleAutor der Antwort Viktor Sehr
Darüber hinaus
make_shared
ist nicht kompatibel mit dem factory-Muster. Dies ist, weil der Aufrufmake_shared
in Ihrem Betrieb-Funktion ruft die Bibliothek-code, der wiederum ruftnew
, die er nicht haben Zugang zu da es nicht nennen die Klasse der privaten Konstruktor(en) (constructor(s) sollten privat sein, wenn Sie nach dem factory-pattern korrekt).InformationsquelleAutor der Antwort Rok Strniša
Mit shared-Sie können nicht angeben, wie Zuordnung und Freigabe von dem Objekt gehalten wird, durchgeführt werden.
Wenn das gewünscht wird, verwenden Sie
std::allocate_shared<T>
statt:Beachten Sie, dass der Vektor braucht nicht informiert zu werden über die Zuweisung!
Zur Herstellung einer benutzerdefinierten Zuweisung, schauen Sie hier https://stackoverflow.com/a/542339/1149664
InformationsquelleAutor der Antwort Johan Lundberg