Heim  >  Artikel  >  Backend-Entwicklung  >  Warum löst „push_back“ mehrere Kopierkonstruktoraufrufe in einem Vektor aus?

Warum löst „push_back“ mehrere Kopierkonstruktoraufrufe in einem Vektor aus?

Barbara Streisand
Barbara StreisandOriginal
2024-11-01 07:17:02533Durchsuche

Why Does `push_back` Trigger Multiple Copy Constructor Calls in a Vector?

Vector Push_back und das Geheimnis mehrfacher Kopierkonstruktoraufrufe

Bei der Arbeit mit Vektoren kann man davon ausgehen, dass die push_back-Operation nur eine Handvoll Kopierkonstruktoraufrufe erfordert. In bestimmten Fällen kann es jedoch zu unerwartetem Verhalten kommen, beispielsweise zu mehreren Aufrufen.

Bedenken Sie den folgenden Codeausschnitt:

<code class="cpp">class Myint {
    int my_int;
public:
    Myint() : my_int(0) { /* ... */ }
    Myint(const Myint& x) : my_int(x.my_int) { /* ... */ }
};

int main() {
    vector<Myint> myints;
    Myint x;

    myints.push_back(x); // Call 1
    x.set(1);
    myints.push_back(x); // Call 2
}</code>

Intuitiv würden wir zwei Aufrufe des Kopierkonstruktors erwarten: einen für den ersten push_back und noch einer für den zweiten. Die Ausgabe erzählt jedoch eine andere Geschichte:

Call 1 (default constructor)
Call 2 (copy constructor: my_int = 0)
Call 3 (copy constructor: my_int = 0)
Call 4 (copy constructor: my_int = 1)

Warum die zusätzlichen Aufrufe?

Interne Vektordynamik

Intern reserviert ein Vektor normalerweise eine bestimmte Menge an Speicher Lagerung. Wenn der zugewiesene Speicherplatz erschöpft ist, muss der Vektor mehr Speicher neu zuweisen. Diese Neuzuweisung löst eine Kopie der vorhandenen Elemente in den neuen Speicher aus.

Im angegebenen Code erfordert der zweite push_back eine Neuzuweisung. Obwohl der Konstruktor für Myint nur zweimal aufgerufen wird, wird der Kopierkonstruktor dreimal verwendet. Dies liegt daran, dass der Kopierkonstruktor verwendet wird, um das erste Element in den neu zugewiesenen Speicher zu verschieben, initialisiert mit seinem ursprünglichen Wert (my_int = 0), und dann der Kopierkonstruktor erneut aufgerufen wird, um das zweite Element zu erstellen, initialisiert mit dem aktualisierten Wert ( my_int = 1) Durch die anfängliche Kapazität des Vektors können Sie eine Neuzuweisung verhindern und Kopiervorgänge minimieren.

Verwenden Sie Emplace_back:

Mit dieser Methode können Sie ein Element direkt an Ort und Stelle konstruieren und so Kopien oder Verschiebungen vermeiden.

  • In diesem Fall würde die Verwendung von Reserve zur Vorabzuweisung von Speicher die Aufrufe des Kopierkonstruktors effektiv auf zwei reduzieren. Darüber hinaus würde emplace_back(0) die Kopie vollständig eliminieren, was zu einer optimalen Leistung führt.

Das obige ist der detaillierte Inhalt vonWarum löst „push_back“ mehrere Kopierkonstruktoraufrufe in einem Vektor aus?. 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