Maison > développement back-end > C++ > le corps du texte

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

Susan Sarandon
Libérer: 2024-11-01 07:45:30
original
748 Les gens l'ont consulté

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>
Copier après la connexion

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
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!