Heim >Backend-Entwicklung >C++ >„std::make_shared' vs. „std::shared_ptr': Was ist effizienter?

„std::make_shared' vs. „std::shared_ptr': Was ist effizienter?

Barbara Streisand
Barbara StreisandOriginal
2024-12-14 02:04:10646Durchsuche

`std::make_shared` vs. `std::shared_ptr`: Which is More Efficient?

Erkennen der Effizienz von std::make_shared im Vergleich zur direkten std::shared_ptr-Nutzung

Verstehen des Unterschieds in der Effizienz zwischen std::make_shared und dem direkten Erstellen eines std: :shared_ptr kann eine verwirrende Aufgabe sein. Hier vertiefen wir uns in einen detaillierten Vergleich, um die Feinheiten jeder Methode zu verdeutlichen.

Erkundung der Konstruktionssequenz

Beachten Sie die folgenden Codeausschnitte:

std::shared_ptr<Object> p1 = std::make_shared<Object>("foo");
std::shared_ptr<Object> p2(new Object("foo"));

Direkt std::shared_ptr Konstruktion:

  1. Heap-Zuweisung für Objekt
  2. Gemeinsamer Zeigerkonstruktor, der einen weiteren Heap-Bereich für Metadaten zuweist

std::make_shared Verwendung:

  1. Kombinierte Heap-Zuweisung, umfassend sowohl Objekt- als auch Metadaten

Entlarvung des Effizienzgewinns

Der Hauptunterschied liegt in der Anzahl der erforderlichen Heap-Zuweisungen:

  • make_shared: 1 Zuordnung
  • Direct shared_ptr: 2 Zuweisungen

Diese einzelne Zuweisung in make_shared macht einen expliziten neuen Aufruf überflüssig, was zu einer höheren Effizienz führt.

Überlegungen zu Ausnahmen

Vor C 17:
Die Ausnahmebehandlung konnte zuvor als Rohzeiger verheerende Folgen haben wurde möglicherweise nicht sicher an den shared_ptr-Konstruktor übergeben.

C 17 und höher:
Dieses Problem wurde dank Änderungen in der Auswertungsreihenfolge der Funktionsargumente behoben. Heutzutage werden Ausnahmen ordnungsgemäß behandelt, um die Speicherintegrität sicherzustellen.

Ein kleiner Nachteil von std::make_shared

Wie Casey betonte, ergibt sich ein potenzieller Nachteil aus der Einzelzuweisung:

  • Der kontrollierte Speicher kann erst freigegeben werden, wenn der Steuerblock nicht mehr verwendet wird, wodurch sich die Speichererhaltung aufgrund eines schwachen Zeigers möglicherweise verlängert Referenzen.

Das obige ist der detaillierte Inhalt von„std::make_shared' vs. „std::shared_ptr': Was ist effizienter?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:Wie kann ich das überladen?Nächster Artikel:Wie kann ich das überladen?