Maison  >  Article  >  développement back-end  >  Pourquoi `vector::push_back` semble-t-il appeler le constructeur de copie plus que prévu ?

Pourquoi `vector::push_back` semble-t-il appeler le constructeur de copie plus que prévu ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-31 22:56:28471parcourir

Why Does `vector::push_back` Seem to Call the Copy Constructor More Than Expected?

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

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