Ich war ungefähr zehn Jahre von ernstem C ++ weg. Ich komme zurück in die Herde und arbeite gerade an einem Projekt, um mich vollständig mit C ++ 11 vertraut zu machen. Ich habe ein bisschen eine existenzielle Krise darüber, wie man am besten std :: shared_ptr herumführt.
Nehmen Sie für ein einfaches Beispiel die folgende Konfiguration:
%Vor%Beachten Sie, dass ServiceA einen Verweis auf ServiceB erfordert. Ich möchte diese Referenz in einem shared_ptr gebunden halten. Kann ich das, was ich hier gemacht habe, gut machen, indem ich shared_ptr einfach als Referenz überlasse und den Kopierkonstruktor std :: shared_ptr für mich arbeiten lasse? Wird die Referenzanzahl für shared_ptr richtig erhöht?
Wenn dies nicht der beste Weg ist, um dies zu tun, was ist die übliche "Best Practice" für die Weitergabe von std :: shared_ptr?
Sie sollten geteilte Zeiger genau weitergeben, wenn Sie andere Objekte passieren. Wenn Sie eine Kopie (des geteilten Zeigers, nicht des auf ein Objekt zeigenden) speichern müssen, übergeben Sie den Wert und gehen Sie zum Ziel.
%Vor%Wenn es Ihnen nichts ausmacht, zwei Konstruktoren zu schreiben, können Sie auch ein kleines bisschen Leistung sparen (ein Aufruf des movie-Konstruktors an den gemeinsamen Zeiger), indem Sie einen schreiben, der eine const-Referenz verwendet und ihn kopiert eine r-Wert-Referenz und verschiebt sie.
%Vor%Entweder übergeben Sie den Wert (Compiler sind ziemlich gut beim Kopieren von Kopien) oder durch const-Verweis - nicht-const-Verweis wie Sie haben, sieht es so aus, als ob Sie beabsichtigen, den Parameter zu ändern.
Auch für neuen Code sollten Sie unique_ptr
für Parameter und Rückgabewerte verwenden, wenn dies sinnvoll ist oder wenn die Freigabe nicht Teil des Vertrags ist. (Sie können shared_ptr
von unique_ptr
erstellen, aber nicht umgekehrt.)
übergeben als Verweis auf nicht-const, wenn Sie beabsichtigen, das tatsächliche Argument zu ändern.
übergeben als Verweis auf const, wenn Sie das nicht beabsichtigen.
Der Verweis auf const ist technisch gesehen nur eine Mikrooptimierung für shared_ptr, aber es ist nicht schädlich, es ist die übliche Konvention für Klassenargumente, und es kann nur einige Nanosekunden abschneiden.
Eine andere Sache, da C einen vorangestellten Unterstrich für Implementierungsnamen verwendet, ist es am besten, das in C ++ zu vermeiden. Anstatt also einen Unterstrich voranzustellen, platzieren Sie ihn am Ende. z.B. Das ist die Konvention in der Boost-Bibliothek. oder verwende einfach eine andere Konvention.