Heim >Backend-Entwicklung >C++ >„make_shared' vs. „shared_ptr': Warum ist One effizienter und ausnahmesicherer?

„make_shared' vs. „shared_ptr': Warum ist One effizienter und ausnahmesicherer?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-14 12:19:11496Durchsuche

`make_shared` vs. `shared_ptr`: Why is One More Efficient and Exception-Safe?

Unterschiede zwischen make_shared und Standard shared_ptr

Warum ist make_shared effizienter?

Um die Effizienz von std::make_shared im Vergleich zu einem standardmäßigen shared_ptr zu verstehen Lassen Sie uns ihre Bauprozesse Schritt für Schritt untersuchen Schritt.

Verwendung des standardmäßigen shared_ptr-Konstruktors:

std::shared_ptr<Object> p2(new Object("foo"));
  • Die Heap-Zuweisung für Object("foo") wird durchgeführt.
  • Der neue std::shared_ptr-Steuerblock wird mit dem Raw erstellt Zeiger.

Verwendung von std::make_shared:

std::shared_ptr<Object> p1 = std::make_shared<Object>("foo");
  • Einzelne Heap-Zuweisung sowohl für den std::shared_ptr-Steuerblock als auch für die Objektinstanz durchgeführt.

Ausnahmesicherheit

Im Standard Beim Shared_ptr-Konstruktor-Ansatz wird keine Bereinigung durchgeführt, wenn während der Konstruktion von Object eine Ausnahme ausgelöst wird, sodass Speicher ungenutzt bleibt. Allerdings garantiert std::make_shared, dass das erstellte Objekt und der Kontrollblock Teil einer einzelnen Zuordnung sind und bereinigt werden, wenn eine Ausnahme ausgelöst wird.

Nachteil von std::make_shared

  • Erhöhte Speicherretention im Vergleich zur Verwendung des standardmäßigen shared_ptr-Konstruktors: Da std::make_shared eine einzelne Zuweisung durchführt, kann der angegebene Speicher nicht freigegeben werden bis der Steuerblock nicht mehr verwendet wird. Schwache Zeiger auf das Objekt können den Kontrollblock am Leben halten und möglicherweise zu einer längeren Speicherretention führen.

Das obige ist der detaillierte Inhalt von„make_shared' vs. „shared_ptr': Warum ist One effizienter und ausnahmesicherer?. 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