Maison  >  Article  >  développement back-end  >  Combien de fois le constructeur de copie est-il appelé lors des opérations « push_back » dans un vecteur C ?

Combien de fois le constructeur de copie est-il appelé lors des opérations « push_back » dans un vecteur C ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-01 07:45:30749parcourir

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

Comprendre le comportement de copie Push_back de Vector

Lorsqu'ils travaillent avec des vecteurs, les développeurs rencontrent souvent des requêtes concernant la fréquence des invocations du constructeur de copie lors des opérations push_back. Examinons ce comportement avec un exemple :

Considérons le code C suivant :

<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>

Cet extrait déclenche normalement le constructeur de copie deux fois pendant les opérations push_back. Cependant, lors de l'exécution, nous observons le résultat suivant :

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

Pourquoi le constructeur de copie semble-t-il être invoqué trois fois ?

  • Insertion Push_back : La première opération push_back insère x dans le vecteur, appelant le constructeur de copie pour initialiser l'élément nouvellement créé.
  • Réallocation du vecteur : Lorsque le deuxième élément est push_back'd, le vecteur rencontre sa capacité limiter et réaffecter la mémoire. Comme Myint ne dispose pas d'un constructeur de déplacement implicitement défini, le constructeur de copie est à nouveau utilisé. Cette fois, il duplique à la fois le premier élément (avec my_int toujours à zéro), puis x (avec my_int mis à jour à un).

Par conséquent, au total, le constructeur de copie est invoqué trois fois. Pour optimiser ce comportement :

  • Réservez la mémoire à l'avance : En spécifiant une capacité vectorielle plus élevée, vous pouvez réduire le risque de réallocation et minimiser la copie.
  • Utilisez emplacement au lieu de push_back : myints.emplace_back(0) construit directement un nouvel élément dans le vecteur, évitant ainsi les copies supplémentaires.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn