IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SL & STL C++ Discussion :

[IO][stream] Fonctionnement de l'opérateur <<


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut [IO][stream] Fonctionnement de l'opérateur <<
    Salut,


    Cela fait bien longtemps que je n'ai plus fait de C++, et suite à la lecture d'un morceau de code j'aurais aimé savoir comment fonctionne exactement l'opérateur << avec des stream.

    Plus précisément, le code est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    std::ofstream out("out.cpp.txt");
     
    for (int i=0; i<10000000; i++) {
        out << "Caraca, estou passando na posição " << i << std::endl;
    }
    out.close();
    Donc ma question est : que se cache-t-il derrière l'opérateur << ???

    Je sais très bien ce qu'il fait et ce que donnera le résultat de ce code. Ce que je voudrais savoir c'est le mécanisme qu'il y a derrière, s'il y a des objets temporaire de créer ou des appels de méthodes implicites...

    a++

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    En fait il y a à chaque fois un appel à la fonction suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::basic_ostream<...>& operator<<(std::basic_ostream<...>&stream, un_type data);
    A chaque fois, c'est la même fonction au type de données à écrire près. Il n'y a pas de recopie du flux, en revanche, je ne sais plus pour le type, si c'est un passage par référence ou un passage par valeur.

  3. #3
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Miles
    Il n'y a pas de recopie du flux, en revanche, je ne sais plus pour le type, si c'est un passage par référence ou un passage par valeur.
    Ok donc il me restera à confirmer cela, car un passage par valeur pourrait être très pénalisant... non ?


  4. #4
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Pour des grosses structures, de toute manière, c'est toi qui va surcharger cet opérateur, donc tu le sauras et pour les types usuels comme int, float, ... c'est sans doute passage par valeur. Perso, j'ai toujours des const type& comme paramètre.

  5. #5
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par adiGuba
    Ok donc il me restera à confirmer cela, car un passage par valeur pourrait être très pénalisant... non ?
    Pour les types present dans ton exemple, j'espere qu'ils sont tous passes par valeur.

    Pour les types utilisateurs, tout depend du type...

  6. #6
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Pour les types present dans ton exemple, j'espere qu'ils sont tous passes par valeur.
    Pour les int OK, mais pour les string le passage par valeur serait plus approprié non ? Car un passage par valeur d'un string impliquerait une recopie de l'objet non ????

    Citation Envoyé par Jean-Marc.Bourguet
    Pour les types utilisateurs, tout depend du type...
    Ok. Mais je me contenterais du code indiqué (donc seulement string, int et std:endl). Je n'ai pas le besoin de traiter les types utilisateurs...



    a++

  7. #7
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par adiGuba
    Pour les int OK, mais pour les string le passage par valeur serait plus approprié non ? Car un passage par valeur d'un string impliquerait une recopie de l'objet non ????
    Je ne vois pas de std::string dans ton exemple, juste un char const*.

  8. #8
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Miles
    Il n'y a pas de recopie du flux,
    Les flux ne sont pas copiables en general.

    en revanche, je ne sais plus pour le type, si c'est un passage par référence ou un passage par valeur.
    Ca depend de celui qui a ecrit le code. J'espere que pour un int, c'est un passage par valeur. Des types standards, je ne vois d'ailleurs que std::string qui a un operateur << definit sur les flux pour lequel le passage par reference serait sense. (J'ai la flemme de verifier ce que demande exactement la norme).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 11
    Dernier message: 06/11/2013, 13h39
  2. [Lazarus] Fonctionnement de Stream.Position
    Par Jipété dans le forum Lazarus
    Réponses: 0
    Dernier message: 06/11/2013, 09h51
  3. Radio streaming ne fonctionne plus
    Par android84 dans le forum Android
    Réponses: 0
    Dernier message: 04/01/2013, 15h21
  4. fonctionner un radio en streaming
    Par étudiante_info dans le forum Android
    Réponses: 1
    Dernier message: 10/05/2011, 18h46
  5. Fonctionnement interne du streaming
    Par ludogoal dans le forum Windows Communication Foundation
    Réponses: 1
    Dernier message: 17/07/2008, 16h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo