new und make_shared für freigegebene Zeiger

Ich bin auf @ gestoßDiepost und eine der Antworten von @kerek SB heißt

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

In Ihrem Code ist die zweite Variable nur ein nackter Zeiger, überhaupt kein gemeinsamer Zeiger.

etzt auf das Fleisch. make_shared ist (in der Praxis) effizienter, weil es den Referenzsteuerblock zusammen mit dem tatsächlichen Objekt in einer einzigen dynamischen Zuordnung zuordnet. Im Gegensatz dazu muss der Konstruktor für shared_ptr, der einen Zeiger auf ein nacktes Objekt verwendet, eine andere dynamische Variable für den Referenzzähler zuweisen. Der Nachteil ist, dass Sie mit make_shared (oder dessen Cousin allocate_shared) kein benutzerdefiniertes Deleter angeben können, da die Zuordnung vom Allokator vorgenommen wird.

(Dies wirkt sich nicht auf die Konstruktion des Objekts selbst aus. Aus Sicht von Object gibt es keinen Unterschied zwischen den beiden Versionen. Effizienter ist der gemeinsame Zeiger selbst, nicht das verwaltete Objekt.)

Nun habe ich zwei Fragen zu diesem Beitrag und würde mich freuen, wenn jemand dies klären könnte

Warum ist der zweite kein gemeinsamer Zeiger? Erhöht das nicht den Referenzzähler

Wie macht make_shared nur eine Speicherzuweisung und new macht zwei, wodurch make_shared effizienter wird?

Eine kleine Klarstellung hierzu wäre wünschenswert.

Antworten auf die Frage(8)

Ihre Antwort auf die Frage