


Pourquoi `vector::push_back` semble-t-il appeler le constructeur de copie plus que prévu ?
Oct 31, 2024 pm 10:56 PMPush_back du vecteur : découverte des appels cachés du constructeur de copie
Dans un scénario déroutant, la méthode push_back d'un vecteur semble invoquer le constructeur de copie plus de fois que prévu. En étudiant ce comportement, entrons dans les détails.
Considérez l'extrait de code fourni :
<code class="cpp">class Myint { //... }; vector<Myint> myints; Myint x; myints.push_back(x); x.set(1); myints.push_back(x);</code>
Initialement, x est poussé dans le vecteur. Comme prévu, une copie se produit lors de l'initialisation. Mais en examinant le résultat, nous découvrons que le constructeur de copie est invoqué trois fois, et non les deux attendus. Quelle est la cause de cet écart ?
Le comportement interne du vecteur entre en jeu. Lorsque le vecteur manque d’espace, il doit réallouer de la mémoire. Dans notre cas, le deuxième push_back déclenche la réallocation. Puisqu'aucun constructeur de déplacement n'est implicitement défini pour Myint, le constructeur de copie est utilisé. Par conséquent, le premier élément est copié dans la mémoire nouvellement allouée, suivi d'une deuxième copie de x. Cette copie supplémentaire explique la troisième invocation du constructeur de copie, où x a my_int défini sur 1.
Par conséquent, au total, trois appels de constructeur de copie se produisent. Ce nombre peut varier en fonction de l'implémentation et de la capacité vectorielle initiale, mais deux appels sont un minimum.
Pour atténuer cela, pensez à réserver plus de mémoire à l'avance en utilisant la méthode de réserve. Cela garantit une capacité suffisante, évitant une réallocation inutile :
<code class="cpp">myints.reserve(2); // Allows two insertions without reallocation</code>
De plus, la méthode emplace_back peut être utilisée pour supprimer les copies :
<code class="cpp">myints.emplace_back(0); // Creates a new element directly in the vector</code>
Emplace_back prend les arguments arbitraires transmis au constructeur, en contournant les copies. ou bouge.
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!

Article chaud

Outils chauds Tags

Article chaud

Tags d'article chaud

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Quels sont les types de valeurs renvoyées par les fonctions du langage C? Qu'est-ce qui détermine la valeur de retour?

Gulc: Cibliothèque C construite à partir de zéro

C Fonction Langue Format de lettre ÉTAPES DE CONVERSION DE CAS

Quelles sont les définitions et les règles d'appel des fonctions du langage C et quelles sont les

Utilisation distincte et partage de phrases

Où est la valeur de retour de la fonction de langue C stockée en mémoire?

Comment fonctionne la bibliothèque de modèle standard C (STL)?

Comment utiliser efficacement les algorithmes du STL (trier, trouver, transformer, etc.)?
