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

Pourquoi le constructeur de copie d'un objet « Myint » est-il invoqué plusieurs fois lors de l'utilisation de « push_back() » sur un « vecteur » ?

Susan Sarandon
Libérer: 2024-10-31 10:58:02
original
405 Les gens l'ont consulté

Why does the copy constructor of a `Myint` object get invoked multiple times when using `push_back()` on a `vector`?

Invocations multiples du constructeur de copie lors de l'opération Push_back du vecteur

En C, lorsqu'un élément est ajouté à un vecteur à l'aide de la méthode push_back() , le constructeur de copie de ce type d'élément est généralement utilisé. Cependant, dans certains scénarios, plusieurs invocations du constructeur de copie peuvent être observées.

Considérez l'extrait de code suivant :

<code class="cpp">class Myint {
  private:
    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;
    }

    void set(const int& x) {
        my_int = x;
    }
};

vector<Myint> myints;
Myint x;

myints.push_back(x);
x.set(1);
myints.push_back(x);</code>
Copier après la connexion

Lorsque ce code est exécuté, la sortie suivante est générée :

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

Cette sortie indique que le constructeur de copie est invoqué quatre fois, pas seulement deux fois comme prévu. La raison de ce comportement réside dans le fonctionnement interne de la gestion de la mémoire du vecteur.

Lorsque push_back() est appelé sur un vecteur qui a atteint sa capacité interne, le vecteur doit être réaffecté pour accueillir le nouvel élément. Lors de cette réallocation, les éléments existants sont copiés vers le nouvel emplacement mémoire. Ce processus entraîne un appel supplémentaire du constructeur de copie pour chaque élément.

Pour éviter ce comportement de copie multiple, certaines mesures peuvent être prises :

  • Réserver une capacité suffisante : En appelant la méthode reserve() sur le vecteur, la capacité interne peut être augmentée à l'avance, évitant ainsi le besoin de réallocation.
  • Utilisation d'emplace_back() : Cette méthode permet de la construction directe d'un élément dans le vecteur, éliminant le besoin de copie.

En employant de telles techniques, les invocations inutiles du constructeur de copie peuvent être minimisées, améliorant ainsi l'efficacité des opérations vectorielles.

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!