Heim >Backend-Entwicklung >C++ >Wie oft wird der Kopierkonstruktor während „push_back'-Operationen in einem C-Vektor aufgerufen?

Wie oft wird der Kopierkonstruktor während „push_back'-Operationen in einem C-Vektor aufgerufen?

Susan Sarandon
Susan SarandonOriginal
2024-11-01 07:45:30835Durchsuche

How Many Times Does the Copy Constructor Get Called During `push_back` Operations in a C   Vector?

Verstehen des Push_back-Kopierverhaltens von Vector

Bei der Arbeit mit Vektoren stoßen Entwickler häufig auf Fragen bezüglich der Häufigkeit von Aufrufen des Kopierkonstruktors während push_back-Vorgängen. Sehen wir uns dieses Verhalten anhand eines Beispiels genauer an:

Betrachten Sie den folgenden C-Code:

<code class="cpp">class Myint {
  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;
  }
};

int main() {
  vector<Myint> myints;
  Myint x;
  myints.push_back(x);
  x.set(1);
  myints.push_back(x);
}</code>

Dieses Snippet löst den Kopierkonstruktor erwartungsgemäß zweimal während der push_back-Vorgänge aus. Bei der Ausführung beobachten wir jedoch die folgende Ausgabe:

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

Warum scheint der Kopierkonstruktor dreimal aufgerufen zu werden?

  • Push_back-Einfügung: Die erste Push_back-Operation fügt x in den Vektor ein und ruft den Kopierkonstruktor auf, um das neu erstellte Element zu initialisieren.
  • Vektorneuzuweisung: Wenn das zweite Element push_back wird, erreicht der Vektor seine Kapazität begrenzt und ordnet den Speicher neu zu. Da es in Myint keinen implizit definierten Move-Konstruktor gibt, wird wieder der Copy-Konstruktor verwendet. Dieses Mal dupliziert es sowohl das erste Element (wobei my_int immer noch auf Null steht) als auch dann x (wobei my_int auf eins aktualisiert wurde).

Daher wird der Kopierkonstruktor insgesamt dreimal aufgerufen. Um dieses Verhalten zu optimieren:

  • Speicher im Voraus reservieren: Durch Angabe einer höheren Vektorkapazität können Sie die Wahrscheinlichkeit einer Neuzuweisung verringern und das Kopieren minimieren.
  • Verwenden Sie emplacement anstelle von push_back: myints.emplace_back(0) erstellt direkt ein neues Element innerhalb des Vektors und vermeidet so zusätzliche Kopien.

Das obige ist der detaillierte Inhalt vonWie oft wird der Kopierkonstruktor während „push_back'-Operationen in einem C-Vektor aufgerufen?. 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