Heim  >  Artikel  >  Backend-Entwicklung  >  Warum wird der Kopierkonstruktor eines „Myint“-Objekts mehrmals aufgerufen, wenn „push_back()“ für einen „Vektor“ verwendet wird?

Warum wird der Kopierkonstruktor eines „Myint“-Objekts mehrmals aufgerufen, wenn „push_back()“ für einen „Vektor“ verwendet wird?

Susan Sarandon
Susan SarandonOriginal
2024-10-31 10:58:02412Durchsuche

Why does the copy constructor of a `Myint` object get invoked multiple times when using `push_back()` on a `vector`?

Mehrere Aufrufe des Kopierkonstruktors während der Push_back-Operation von Vector

In C, wenn ein Element mithilfe der push_back()-Methode zu einem Vektor hinzugefügt wird , wird normalerweise der Kopierkonstruktor dieses Elementtyps verwendet. In bestimmten Szenarien können jedoch mehrere Aufrufe des Kopierkonstruktors beobachtet werden.

Beachten Sie den folgenden Codeausschnitt:

<code class="cpp">class Myint {
  private:
    int my_int;

  public:
    Myint() : my_int(0) {
        cout << "Inside default " << endl;
    }

    Myint(const Myint& x) : my_int(x.my_int) {
        cout << "Inside copy with my_int = " << x.my_int << endl;
    }

    void set(const int& x) {
        my_int = x;
    }
};

vector<Myint> myints;
Myint x;

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

Wenn dieser Code ausgeführt wird, wird die folgende Ausgabe generiert:

Inside default
Inside copy with my_int = 0
Inside copy with my_int = 0
Inside copy with my_int = 1

Diese Ausgabe zeigt an, dass der Kopierkonstruktor viermal aufgerufen wird und nicht nur zweimal wie erwartet. Der Grund für dieses Verhalten liegt in den internen Abläufen der Speicherverwaltung des Vektors.

Wenn push_back() für einen Vektor aufgerufen wird, der seine interne Kapazität erreicht hat, muss der Vektor neu zugewiesen werden, um das neue Element aufzunehmen. Bei dieser Neuzuweisung werden die vorhandenen Elemente an den neuen Speicherort kopiert. Dieser Vorgang führt zu einem zusätzlichen Aufruf des Kopierkonstruktors für jedes Element.

Um dieses Mehrfachkopierverhalten zu vermeiden, können einige Maßnahmen ergriffen werden:

  • Ausreichende Kapazität reservieren: Durch Aufrufen der Methode „reserve()“ auf dem Vektor kann die interne Kapazität im Voraus erhöht werden, sodass keine Neuzuweisung erforderlich ist.
  • Verwendung von emplace_back(): Diese Methode ermöglicht die direkte Konstruktion eines Elements innerhalb des Vektors, wodurch das Kopieren überflüssig wird.

Durch den Einsatz solcher Techniken können unnötige Aufrufe des Kopierkonstruktors minimiert werden, wodurch die Effizienz von Vektoroperationen verbessert wird.

Das obige ist der detaillierte Inhalt vonWarum wird der Kopierkonstruktor eines „Myint“-Objekts mehrmals aufgerufen, wenn „push_back()“ für einen „Vektor“ verwendet wird?. 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