Invocations multiples du constructeur de copie dans le vecteur Push-Back
Dans l'extrait donné, la méthode push_back de l'objet vectoriel myints appelle la copie constructeur plus de deux fois, contredisant l’attente initiale. Cela soulève des questions sur le comportement interne du vecteur.
Explication :
Premier refoulement :
- A le nouvel élément est inséré dans le vecteur en utilisant x. Cela déclenche une opération de copie : l'initialisation du nouvel élément à l'aide de l'argument. Étant donné que le constructeur par défaut de x initialise my_int à zéro, le constructeur de copie rapporte zéro.
Deuxième refoulement et réallocation :
- Le deuxième élément est push_back'd. Cependant, la capacité du vecteur est dépassée, ce qui nécessite une réallocation. Comme Myint ne dispose pas d'un constructeur de déplacement implicite, le constructeur de copie est utilisé à la place.
- Le premier élément est copié dans la nouvelle mémoire, en conservant sa valeur zéro. Par la suite, x est copié pour initialiser le deuxième élément avec my_int défini sur un, comme indiqué dans la sortie du constructeur de copie.
- Il en résulte trois invocations totales du constructeur de copie.
Le nombre d'appels :
- Le nombre d'appels au constructeur de copie peut varier selon les différentes implémentations en raison de la capacité vectorielle initiale. Cependant, deux appels sont le minimum.
- La réallocation peut être évitée, réduisant ainsi les opérations de copie, en augmentant à l'avance la capacité du vecteur à l'aide de reserve(2).
Réduire Opérations de copie :
- Alternativement, la méthode emplace_back peut être utilisée pour l'insertion d'éléments. Elle ne nécessite pas de copies ou de déplacements, transmettant directement les arguments au constructeur de l'élément.
En résumé, la méthode push_back peut entraîner plusieurs invocations de constructeur de copies en raison de la restructuration interne du vecteur. Pour éviter cela, reserve() peut être utilisé pour augmenter la capacité ou emplace_back peut être utilisé pour une insertion efficace d'éléments sans copies.
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!