webentwicklung-frage-antwort-db.com.de

Sollte ich von boost :: shared_ptr zu std :: shared_ptr wechseln?

Ich möchte die Unterstützung für C++ 0x in GCC mit -std=c++0x Aktivieren. Ich brauche keines der derzeit unterstützten C++ 11-Features in GCC 4.5 (und bald 4.6) unbedingt, aber ich würde mich gerne daran gewöhnen. Zum Beispiel wäre an einigen Stellen, an denen ich Iteratoren verwende, ein Typ auto nützlich.

Aber auch hier benötige ich keine der derzeit unterstützten Funktionen . Ziel ist es, mich zu ermutigen, die Merkmale des neuen Standards in mein Programmiervokabular aufzunehmen.

Nach dem, was Sie über die C++ 11-Unterstützung wissen, ist es eine gute Idee, sie in GCC zu aktivieren und sie dann zu akzeptieren, indem Sie beispielsweise von boost::shared_ptr Auf std::shared_ptr Exklusiv als wechseln Mischen sich die beiden nicht?

PS: Ich bin mir bewusst, dass diese gute Frage die verschiedenen Geschmacksrichtungen von shared_ptr Vergleicht, aber ich frage nach einem Ratschlag auf höherer Ebene, den ich verwenden soll, bevor der Standard fertiggestellt ist. Eine andere Möglichkeit ist, wenn ein Compiler wie GCC sagt, dass er eine "experimentelle Funktion" unterstützt, heißt das, dass ich während des Kompilierens wahrscheinlich auf seltsame Fehler stoße, die große Zeitverluste und eine Quelle für kryptische Fragen in StackOverflow sind?

Bearbeiten : Ich habe beschlossen, von std::shared_ptr Zurückzukehren, weil ich der Unterstützung in GCC 4.5 einfach nicht als angezeigt) vertraue Beispiel in dieser Frage .

65
Alan Turing

Es gibt mehrere Gründe, auf std::shared_ptr umzuschalten:

  • Sie entfernen eine Abhängigkeit von Boost.
  • Debugger. Abhängig von Ihrem Compiler und Debugger ist der Debugger in Bezug auf std::shared_ptr Möglicherweise "schlau" und zeigt das Objekt, auf das verwiesen wird, direkt an, wo es beispielsweise die Implementierung von Boost nicht unterstützen würde. Zumindest in Visual Studio sieht std::shared_ptr Wie ein einfacher Zeiger im Debugger aus, während boost::shared_ptr Einige Innereien von Boosts offenlegt.
  • Andere neue Funktionen, die in Ihrer verknüpften Frage definiert sind.
  • Sie erhalten eine Implementierung, bei der fast garantiert ist, dass sie für die Verschiebungssemantik geeignet ist, wodurch möglicherweise einige Änderungen an der Nachzählung eingespart werden. (Theoretisch - ich habe das nicht selbst getestet) Zumindest ab dem 22.07.2014 versteht boost::shared_ptr Die Bewegungssemantik.
  • std::shared_ptr Verwendet korrekterweise delete [] Für Array-Typen, während boost::shared_ptr In solchen Fällen undefiniertes Verhalten verursacht (Sie müssen shared_array Oder einen benutzerdefinierten Deleter verwenden). (Eigentlich stehe ich korrigiert. Siehe this - die Spezialisierung dafür ist nur für unique_ptr, Nicht für shared_ptr.)

Und ein Hauptgrund, warum man nicht:

  • Sie würden sich auf C++ 11-Compiler- und Standardbibliotheksimplementierungen beschränken.

Schließlich müssen Sie sich nicht wirklich entscheiden. (Wenn Sie auf eine bestimmte Compiler-Serie (z. B. MSVC und GCC) abzielen, können Sie diese problemlos auf die Verwendung von std::tr1::shared_ptr Erweitern, sofern verfügbar. Leider scheint es keine Standardmethode zur Erkennung der TR1-Unterstützung zu geben.)

#if __cplusplus > 199711L
#include <memory>
namespace MyProject
{
    using std::shared_ptr;
}
#else
#include <boost/shared_ptr.hpp>
namespace MyProject
{
    using boost::shared_ptr;
}
#endif
58
Billy ONeal

Ich nehme an, es hängt davon ab, wie oft Sie Boost verwenden. Ich persönlich benutze es nur sehr sparsam (in der Tat die Zufallszahlenbibliothek, in einem einzigen Projekt). Ich habe vor kurzem angefangen, -std=c++0x für meine anderen Projekte, und ich verwende die neuen Funktionen der std :: library wie shared_ptr in ihnen. Ich mag es, wenn meine Projekte ein Minimum an Abhängigkeiten aufweisen, daher bin ich eher auf die Standard-Bibliotheksimplementierung des Compilers als auf Boost angewiesen.

Aber ich glaube nicht, dass es eine einheitliche Antwort auf diese Frage gibt.

13

Sie sollten immer std::shared_ptr wo immer möglich, statt Boost. Dies liegt im Grunde daran, dass alle neuen Schnittstellen, die shared_ptr verwendet den gemeinsam genutzten Standard-ptr.

12
Puppy

Es ist wahrscheinlich keine schlechte Idee, sich daran zu gewöhnen, std :: shared_ptr zu verwenden, wenn der Compiler dies erlaubt. Da die Schnittstelle mit shared_ptr von boost identisch ist, können Sie bei Bedarf jederzeit zurückschalten.

7
Chris Mennie

Abgesehen von der Implementierungskonsistenz ist boost::shared_ptr behält derzeit mindestens zwei Nischenvorteile gegenüber std::shared_ptr:

  • Die Verfügbarkeit von boost::make_shared_noinit . Dies ist besonders in Verbindung mit Arrays nützlich, da sowohl die Kosten für die Nullinitialisierung als auch der Aufwand für die separate Zuordnung vermieden werden. (FWIW, es ist auch ein vorgeschlagener Zusatz zum Standard.)
  • Boost.Python nutzt speziell boost::shared_ptrs Unterstützung für benutzerdefinierte Löschvorgänge mit gelöschten Zeichen, aber tut dies noch nicht für std::shared_ptr .
4
dhaffey

Ein weiterer Grund, auf std::shared_ptr Umzuschalten: Es unterstützt std::unique_ptr, D. H. Hat einen Konstruktor.

boost::shared_ptr Nicht.

4
papafi

Wenn Sie nur auf der einen Plattform bauen, die in Ordnung ist (schalten Sie um)
(Hinweis: Sie haben Komponententests, um die Abwärtskompatibilität zu überprüfen, oder?)

Wenn Sie auf mehreren Plattformen kompilieren, wird es etwas umständlicher, da Sie überprüfen müssen, ob die Funktionen von g ++ 4.5 auf allen von Ihnen verwendeten Plattformen verfügbar sind Version steht hinter den Standard-Compilern unter Linux).

4
Martin York

Ich fand std :: shared_ptr schneller als boost :: shared_ptr. Ich habe einen Test durchgeführt. Sie können den Code überprüfen und die Ergebnisse des Kreisdiagramms sehen, in denen die gemeinsamen Zeiger boost, Qt und std verglichen werden.

enter image description here

https: //www.osletek.com ...

1
rosewater