2010-11-19 20 views
0

un corps peut expliquer le comportement dans la sortie lors de l'exécution du code suivant. Je suis un peu confus à propos du nombre de fois que le constructeur de copie est appelé.Problème de constructeur de copie lors de la lecture d'un objet directement dans un vecteur en utilisant des itérateurs de copie et de flux.

using namespace std; 
class A { 
    int i; 
public: 
    A() { 
    }; 
    A(const A& a) { 
     i = a.i; 
     cout << "copy constructor invoked" << endl; 
    }; 
    A(int num) { 
     i = num; 
    }; 
    A& operator = (const A&a) { 
     i = a.i; 
//  cout << "assignment operator invoked" << endl; 
    }; 
    ~A() { 
     cout << "destructor called" << endl; 
    }; 
    friend ostream& operator << (ostream & out, const A& a); 
    friend istream& operator >> (istream &in, A&a); 
}; 

ostream & operator << (ostream &out, const A& a) { 
    out << a.i; 
    return out; 
} 

istream & operator >> (istream & in, A&a) { 
    in >> a.i; 
    return in; 

} 
int main() { 
    vector<A> vA; 
    copy(istream_iterator<A>(cin), istream_iterator<A>(), back_inserter(vA)); 
// copy(vA.begin(), vA.end(), ostream_iterator<A>(cout, "\t")); 
    return 0; 
} 

La sortie observée est

 

[email protected]:~/workspace/ostream_iterator/src$ ./a.out 
40 
copy constructor invoked 
copy constructor invoked 
copy constructor invoked 
copy constructor invoked 
copy constructor invoked 
copy constructor invoked 
copy constructor invoked 
copy constructor invoked 
copy constructor invoked 
copy constructor invoked 
copy constructor invoked 
destructor called 
destructor called 
destructor called 
destructor called 
destructor called 
destructor called 
destructor called 
destructor called 
destructor called 
destructor called 
destructor called 
destructor called 
destructor called 
[email protected]:~/workspace/ostream_iterator/src$ 

 

Je pensais que le constructeur de copie serait appelée une fois lors de l'insertion dans le vecteur, comme des objets conteneurs stocke des valeurs.

+0

Avez-vous essayé d'activer les optimisations? –

+0

même avec optimisation de niveau 3 je reçois le même nombre d'appels de construtor de copie, et j'utilise gcc version 4.4.3. – ajayreddy

Répondre

0

Le constructeur de copie doit être appelé au moins 3 fois:

  • 1 exemplaire par istream_iterator passé à std::copy, comme istream_iterator stocke une valeur locale du type paramétrés et copies les plus probables dans sa copie constructeur et ils sont passés par valeur à std::copy. (2)
  • 1 pour insérer dans vector<A> vA via vA.push_back(...), appelé par l'opérateur back_inserter(vA) affectation . (3)

Le compilateur peut probablement optimiser quelques-unes de ces copies, mais l'origine des 8 autres est un mystère pour moi.

EDIT: Soit dit en passant, je reçois 8 appels au constructeur de copie en cours d'exécution sur codepad.org: http://codepad.org/THFGFCCk

EDIT2: Quand je courais cela avec VS2008, je suis 7 appels au constructeur de copie. Les 4 supplémentaires étaient le résultat de la copie autour des itérateurs d'entrée vers std::copy pour la vérification des limites dans une version de débogage. Lors de l'exécution dans une construction entièrement optimisée, je reçois seulement 3 appels au constructeur de copie.

0

L'istream_iterator est construit et copié plusieurs fois. Voici ma sortie:

40 
copy constructor invoked 
copy constructor invoked 
copy constructor invoked 
copy constructor invoked 
destructor called 
destructor called 
destructor called 
destructor called 
copy constructor invoked 
copy constructor invoked 
destructor called 
copy constructor invoked 
copy constructor invoked 
destructor called 
copy constructor invoked 
copy constructor invoked 
copy constructor invoked 
copy constructor invoked 
copy constructor invoked 
copy constructor invoked 
copy constructor invoked