395 Stimmen

Unterschied zwischen make_shared und normalem shared_ptr in C++

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

Viele Google- und Stackoverflow-Beiträge gibt es dazu, aber ich verstehe nicht, warum make_shared effizienter ist als die direkte Verwendung von shared_ptr.

Kann mir jemand Schritt-für-Schritt erklären, welche Objekte erstellt werden und welche Operationen von beiden durchgeführt werden, damit ich verstehen kann, wie make_shared effizient ist? Ich habe ein Beispiel oben als Referenz gegeben.

4voto

James Punkte 41

Shared_ptr: Führt zwei Speicherzuweisungen im Heap durch

  1. Steuerungsblock (Referenzzähler)
  2. Verwaltetes Objekt

Make_shared: Führt nur eine Speicherzuweisung im Heap durch

  1. Steuerungsblock und Objektdaten.

1voto

Martin Vorbrodt Punkte 44

Ich glaube, dass der Teil zur Ausnahmesicherheit in der Antwort von Herrn Mpark immer noch eine gültige Sorge ist. Beim Erstellen eines shared_ptr wie diesem: shared_ptr< T >(new T), kann das neue T erfolgreich sein, während die Zuweisung des Steuerblocks des shared_ptrs fehlschlagen kann. In diesem Szenario wird das neu zugewiesene T undicht sein, da der shared_ptr nicht wissen kann, dass es vor Ort erstellt wurde und sicher gelöscht werden kann. Oder übersehe ich etwas? Ich denke nicht, dass die strengeren Regeln zur Auswertung von Funktionsparametern hier irgendwie helfen...

0voto

orlando Punkte 9

Über Effizienz und die Zeit, die für die Zuteilung aufgewendet wird, habe ich den einfachen Test unten erstellt, in dem ich viele Instanzen auf diese beiden Arten erstellt habe (einzeln):

for (int k = 0 ; k < 30000000; ++k)
{
    // dauerte länger als die Verwendung von new
    std::shared_ptr foo = std::make_shared (10);

    // war schneller als die Verwendung von make_shared
    std::shared_ptr foo2 = std::shared_ptr(new int(10));
}

Das Ding ist, die Verwendung von make_shared hat die doppelte Zeit im Vergleich zur Verwendung von new in Anspruch genommen. Also gibt es bei der Verwendung von new zwei Heap-Zuweisungen anstelle von einer bei der Verwendung von make_shared. Vielleicht ist das ein dummer Test, aber zeigt er nicht, dass die Verwendung von make_shared mehr Zeit in Anspruch nimmt als die Verwendung von new? Natürlich spreche ich nur über die Zeit, die verwendet wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X