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

C++ Discussion :

Boucles for, condition d'arrêt, optimisations des compilateurs


Sujet :

C++

  1. #1
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut Boucles for, condition d'arrêt, optimisations des compilateurs
    Hello,

    Lorsqu'on a :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    std::vector<int> collec;
    std::vector<int>::iterator pos;
     
    for (pos = collec.begin(); pos != collec.end(); ++pos)
    {
        ...
    }
    la méthode collec.end() est-elle appelée à chaque itération, ou le compilateur, par souci d'optimisation, ne l'appelle-t-elle qu'à la première itération ?

    Plus globalement, la valeur de la condition d'arrêt est-elle évaluée à chaque itération d'une boucle for ?

  2. #2
    Membre confirmé
    Femme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2009
    Messages
    339
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 339
    Points : 586
    Points
    586
    Par défaut
    Elle est évaluée à chaque itération parce que les variables de ta condition d'arrêt peuvent évoluer.

  3. #3
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Et du coup, on croise très fréquemment dans du code C++ l'idiome suivant pour itérer sur un conteneur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (iterator pos = collec.begin(), end = collec.end(); pos != end; ++pos)
    {
        ...
    }
    Ou sur deux lignes si le type de l'itérateur est trop long :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (std::vector<MyVeryVeryVeryLongIteratorType>::iterator pos = collec.begin(), 
          end = collec.end(); pos != end; ++pos)
    {
        ...
    }

  4. #4
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    ou encore std::for_each(), méthode censée être préférée.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  5. #5
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 576
    Points : 1 528
    Points
    1 528
    Par défaut
    Il n'y a même pas un optim du compilo si collec est déclaré const, ou si on y accède que par des méthodes const dans la boucle ?
    La perfection est atteinte, non pas lorsqu’il n’y a plus rien à ajouter, mais lorsqu’il n’y a plus rien à retirer. - Antoine de Saint-Exupéry

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Citation Envoyé par Arzar Voir le message
    Et du coup, on croise très fréquemment dans du code C++ l'idiome suivant pour itérer sur un conteneur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (iterator pos = collec.begin(), end = collec.end(); pos != end; ++pos)
    {
        ...
    }
    Oui, et c'est ce qui m'étonne.
    Je suis en train de relire "The C++ Standard Library" de N. Jossutis, et tous ses exemples sont sur ce mode. Or, il ne change jamais les collections pendant ses traitements (du moins, dans ceux que j'ai vu jusqu'à présent). D'où ma question, parce que je me disais qu'appeler, pour chaque itération, une fonction qui retourne le même résultat, c'était bof...

Discussions similaires

  1. Linux, boucle for qui s'arrête : limite mémoire ?
    Par ticad dans le forum Langage
    Réponses: 3
    Dernier message: 18/01/2012, 14h24
  2. Boucle For Next infinie sur enregistrement des pieces jointes
    Par moumerico dans le forum Général VBA
    Réponses: 4
    Dernier message: 25/08/2010, 09h43

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