Heim > Backend-Entwicklung > C++ > Hauptteil

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

Susan Sarandon
Freigeben: 2024-11-01 07:45:30
Original
748 Leute haben es durchsucht

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>
Nach dem Login kopieren

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
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!