Heim >Backend-Entwicklung >C++ >Ist „std::make_shared' effizienter als die direkte Konstruktion von „std::shared_ptr'?

Ist „std::make_shared' effizienter als die direkte Konstruktion von „std::shared_ptr'?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2025-01-04 03:39:40988Durchsuche

Is `std::make_shared` More Efficient Than Directly Constructing `std::shared_ptr`?

Effizienz von std::make_shared

Beim Entwerfen eines gemeinsamen Zeigers aus einem Rohzeiger mithilfe der Funktion std::make_shared gibt es einen Unterschied in der Effizienz im Vergleich zur direkten Erstellung eines std::shared_ptr mithilfe eines Konstruktors. Hier ist eine Schritt-für-Schritt-Erklärung:

std::make_shared:

  1. Reservieren Sie Speicher für den Steuerblock (der die Referenzzählung und andere Metadaten verwaltet). ) und das Objekt.
  2. Konstruieren Sie das std::shared_ptr-Objekt mit dem zugewiesenen Speicher.

Direkter std::shared_ptr-Konstruktor:

  1. Speicher für das Objekt mit new zuweisen.
  2. Speicher zuweisen für der Steuerblock.
  3. Konstruieren Sie das std::shared_ptr-Objekt mit dem zugewiesenen Speicher.

Wie Sie sehen können, führt std::make_shared eine einzelne Zuweisung durch (sowohl für den Steuerblock als auch für das Objekt), während die direkte Konstruktormethode zwei Zuweisungen durchführt (eine für das Objekt, eine andere). für den Steuerblock). Dieser Unterschied in den Zuweisungen führt zu einer höheren Effizienz bei der Verwendung von std::make_shared.

Ausnahmesicherheit

Vor C 17 war die Verwendung von std::make_shared auch eher ausnahmesicher. sicher. Betrachten Sie den folgenden Code:

void f(const std::shared_ptr<Object1>& obj1, const std::shared_ptr<Object2>& obj2) {
  // ...
}

int main() {
  f(std::shared_ptr<Object1>(new Object1()), std::shared_ptr<Object2>(new Object2()));
  return 0;
}

Ohne std::make_shared ist die Reihenfolge der Auswertung der Argumente nicht angegeben, und wenn die Zuweisung von Objekt1 fehlschlägt, würde der Speicher für Objekt2 verloren gehen. Mit std::make_shared wird dieses Ausnahmesicherheitsproblem behoben.

Nachteil von std::make_shared

Ein potenzieller Nachteil von std::make_shared besteht darin, dass es dies kann Verhindern Sie eine vorzeitige Freigabe des Objektspeichers. Im Gegensatz zur direkten Konstruktormethode erstellt std::make_shared einen einzelnen Speicherblock für den Steuerblock und das Objekt. Dies bedeutet, dass der Speicher sowohl für das Objekt als auch für den Steuerblock nicht unabhängig voneinander freigegeben werden kann. Wenn es schwache Zeiger gibt, die auf das Objekt zeigen, können sie den Steuerblock auch dann am Leben halten, wenn das Objekt selbst nicht mehr verwendet wird, was möglicherweise zu Speichereinlagerungen führt.

Das obige ist der detaillierte Inhalt vonIst „std::make_shared' effizienter als die direkte Konstruktion von „std::shared_ptr'?. 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