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.
Antworten
Zu viele Anzeigen?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...
Ü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.
- See previous answers
- Weitere Antworten anzeigen