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 :

Dans quel ordre s'effectue l'affectation? et autres opérations binaire


Sujet :

C

  1. #1
    Membre habitué Avatar de dafpp
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 345
    Points : 196
    Points
    196
    Par défaut Dans quel ordre s'effectue l'affectation? et autres opérations binaire
    Bonsoir, toute simple question, si je fais ça :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int a,b,c,d =0;
    ...
    a = b = c = d = 0;
    Dans quel ordre se passe l'opération? Forcement :
    d=0c=db=ca=bDonc en soit c'est pas plus rapide que:
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int  a, b, c, d = 0;
    ...
    a = 0;
    b = 0;
    c = 0;
    d = 0;
    ?

    C'est même plus lent, car il n'y a pas d'histoire de récupérer la valeur pour l'affecter. Pour le dernier, zéro est gardé, donc la valeur est déjà en mémoire et ainsi de suite.

    J'y pensais aussi, est-ce que ça équivaut à :
    a & b & c & d & 0?
    Et normalement a & 0 est plus rapide que a = 0? Et a ^ a ou a % a?
    "Les spécialistes commencent par n'apprendre que ce qu'ils aiment et finissent par n'aimer que ce qu'ils ont appris." - Gilbert Cesbron
    "Si nous avons chacun un objet et que nous les echangeons, nous avons chacun un objet. Si nous avons chacun une idée et que nous les échangeons, nous avons chacun deux idées." - Proverbe Chinois.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 370
    Points : 23 625
    Points
    23 625
    Par défaut
    Bonsoir,

    Ce sera strictement équivalent. D'abord parce que les compilateurs d'aujourd'hui sont suffisamment intelligents pour trouver d'eux-mêmes la meilleure voie pour parvenir à un résultat, et qu'ils ont une certaine latitude pour agir entre deux points de séquence.

    Vis-à-vis de l'affectation en cascade, les micro-processeurs et d'une manière générale les machines à registres font un usage poussé des accumulateurs, avec lesquels le résultat forme automatiquement la première opérande de l'opération suivante (un peu comme l'écran d'une calculatrice).

    Enfin, avec 0 en particulier, les micro-processeurs disposent généralement d'une instruction CLR (« Clear ») ou assimilée pour le faire de manière implicite sans avoir besoin de faire un accès bus. Sur x86, on obtient cela avec « XOR registre,registre », puisque le résultat d'un OU exclusif d'une valeur sur elle-même donne toujours zéro.

    Citation Envoyé par dafpp Voir le message
    J'y pensais aussi, est-ce que ça équivaut à :
    a & b & c & d & 0?
    Non, ça n'a rien à voir. Le « & » seul correspond au ET logique bit à bit. Il n'y a aucune affectation. Tes variables resteront inchangées. Par contre, l'expression elle-même est légale et peut être évaluée. Mais comme son résultat est perdu à la fin (puisque tu ne l'affectes à aucune variable ni ne la retourne à une autre fonction) et que de toutes façons, tu la termines par « & 0 » dont le résultat sera toujours nul, il est probable que ton compilo ne se donne même pas la peine de la calculer. Si tu passes des options d'optimisations explicites (par exemple « -O3 » à GCC), l'expression entière passera à la trappe comme si tu l'avais mise en commentaire.

    Et normalement a & 0 est plus rapide que a = 0? Et a ^ a ou a % a?
    « & », « ^ » et « = » seront aussi rapides les uns que les autres car il s'agit d'opérations logiques fondamentales : elles sont directement câblées, électroniquement, au sein du micro-processeur et le résultat apparaît immédiatement sans qu'il ait besoin de poser le calcul. À dire vrai, c'est avec des portes logique ET, OU, NON-ET, etc. que les circuits numériques en tous genres implémentent les additions et les soustractions en binaire naturel.

    Pour « % », ce sera un poil plus lent car il faut effectuer une division pour obtenir le modulo. Et la division est une opération relativement difficile, d'autant plus qu'à la différence des trois autres opérations fondamentales, elle peut déclencher une exception (le cas de la division par zéro). Les x86 et autres micro-processeurs puissants la proposent directement mais elle reste plus longue à exécuter que les autres. Les micro-processeurs plus modestes auront besoin de la résoudre logiciellement (en appelant une routine écrite pour).

    Cela dit, il n'y a rien qui soit ici réellement palpable sur une machine moderne (comprendre par là : âgée de moins de 20 ans tout de même !) ni qui justifie une optimisation à la main directement dans le code source.

  3. #3
    Membre habitué Avatar de dafpp
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 345
    Points : 196
    Points
    196
    Par défaut
    Tout compris. Très bien merci.
    "Les spécialistes commencent par n'apprendre que ce qu'ils aiment et finissent par n'aimer que ce qu'ils ont appris." - Gilbert Cesbron
    "Si nous avons chacun un objet et que nous les echangeons, nous avons chacun un objet. Si nous avons chacun une idée et que nous les échangeons, nous avons chacun deux idées." - Proverbe Chinois.

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    a ^= a sera probablement plus lent que a = 0 si a est stocké en RAM plutôt qu'un registre, vu que ça impose une lecture de la mémoire en plus de l'écriture.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre éclairé
    Avatar de bpy1401
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2003
    Messages
    471
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2003
    Messages : 471
    Points : 831
    Points
    831
    Par défaut
    Bonjour à tous.

    Pour faire une réponse globale, moi je ne fais jamais confiance au compilateur (c'est du à mon expérience de programmation embarquée ou les compilo n'étaient pas forcement très fiables). Du coup je n'écrit jamais

    mais plutot
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int a;
    int b;
    int c;
    int d;
     
    void init(void) {
      a = 0;
      b = 0;
      c = 0;
      d = 0; 
    }
    la fonction d'initialisation (toujours en embarqué permet d’éviter des problèmes de RESET à chaud).

    Du coup, même lorsque je fait un programme sur PC , je garde les mêmes règles. Pour moi, l'initialisation n'est pas forcement l'endroit ou j’optimise en vitesse. On ne le fait qu'une fois.

    Pour fnir, si tu utilise des outils qui test la qualité de ton code, ta solution risque de lever des warning.
    Page sur Developpez : http://pbriand.developpez.com

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 370
    Points : 23 625
    Points
    23 625
    Par défaut
    Citation Envoyé par bpy1401 Voir le message
    Du coup je n'écrit jamais
    […]
    mais plutot
    […]
    Du coup, même lorsque je fait un programme sur PC , je garde les mêmes règles. Pour moi, l'initialisation n'est pas forcement l'endroit ou j’optimise en vitesse. On ne le fait qu'une fois.
    Les globales, c'est mal.

  7. #7
    Membre habitué Avatar de dafpp
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 345
    Points : 196
    Points
    196
    Par défaut
    Citation Envoyé par bpy1401 Voir le message
    Mais ça ce n'est pas la même chose que a=b=c=d=0; ou même
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    a=0;
    b=0;
    c=0;
    d=0;
    "Les spécialistes commencent par n'apprendre que ce qu'ils aiment et finissent par n'aimer que ce qu'ils ont appris." - Gilbert Cesbron
    "Si nous avons chacun un objet et que nous les echangeons, nous avons chacun un objet. Si nous avons chacun une idée et que nous les échangeons, nous avons chacun deux idées." - Proverbe Chinois.

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Obsidian Voir le message


    Surtout que c'est pas compliqué de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int a;
    int b;
    int c;
    int d;
     
    void init(int *a, int *b, int *c, int *d) {
      *a = 0;
      *b = 0;
      *c = 0;
      *d = 0; 
    }
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 30/04/2009, 19h36
  2. Par où commencer et dans quel ordre ?
    Par Kromagg dans le forum Développement 2D, 3D et Jeux
    Réponses: 4
    Dernier message: 30/01/2009, 20h52
  3. Dans quel ordre se fait l'évaluation
    Par dj.motte dans le forum C
    Réponses: 12
    Dernier message: 22/08/2008, 23h40
  4. Dans quel ordre ranger les vertices ?
    Par legend666 dans le forum OpenGL
    Réponses: 5
    Dernier message: 10/10/2005, 10h01

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