Il s'agit de post-incrémentation (x++) et de pré-incrémentation (++x). x++ incrémente x et retourne l'ancienne valeur de x ++x incrémente x et retourne la nouvelle valeur de x. Exemple : x=5; a=x++; /*x vaut 6 et a vaut 5 (ancienne valeur)*/
x=5; a=++x; /*x vaut 6 et a vaut 6 (nouvelle valeur)*/
++i est aussi très légèrement plus rapide (comprendre que c’est négligeable) que i++ car pour la post-incrémentation, il faut mémoriser l’ancienne valeur. De nos jours, avec les optimisations du compilateur c’est plus trop vrai, mais bon.
++i est aussi très légèrement plus rapide (comprendre que c’est négligeable) que i++ car pour la post-incrémentation, il faut mémoriser l’ancienne valeur.
Qu'est-ce qui te fait penser qu'il faudrait la mémoriser? En pseudo-assembleur
// a = i++;
move r1, r2
inc r1
// a = ++i
inc r1
move r1, r2
J'ai vu des justifications en C++ avec surcharge d'opérateur, mais sinon pas de souvenir.
J’ai lu ça sur un site (j’ai pas noté l’adresse, c’était dans un cours publié par un enseignant…), il disait qu’il fallait une opération de plus pour la post-incrémentation pour recharger la variable en mémoire ou la copier avant car on ne peut effectuer des opérations que dans les registres et que la valeur chargée était souvent perdu, par exemple avec ce genre de calcul : i++ + j++, i et j sont chargé dans des registres (eax et edx p.ex.) et lors de l’addition des deux, un des deux registres est utilisé pour contenir le résultat, et donc la valeur d’une des variables est perdu et doit donc être rechargé (sauf si on avait fait une copie avant).
Alors que pour incrémenter suffit d’un :
addl $1, -8(%ebp)
(Dans l’assembleur généré par GCC)
Ce qui rend faux l’assertion de départ.
Donc, ce que j’ai dit est faux en effet, je vais corriger ça tout de suite (d’un grand coup de crayon).
Merci.
Tu utilises le post incrémentation, tu dois faire une copie de cette objet pour l'envoyer, puis après incrémenter le réel.
Et qu'est-ce qui empêcherait d'envoyer la valeur, exécuter l'appel puis incrémenter ? Ce qui en temps d'exécution reviendrait au même. Sinon, la copie est faite de toute façon.
Pour les data volumineuses, on ne peut pas faire de ++ dessus, non ?
Tu utilises le post incrémentation, tu dois faire une copie de cette objet pour l'envoyer, puis après incrémenter le réel.
Et qu'est-ce qui empêcherait d'envoyer la valeur, exécuter l'appel puis incrémenter ? Ce qui en temps d'exécution reviendrait au même. Sinon, la copie est faite de toute façon.
Pour les data volumineuses, on ne peut pas faire de ++ dessus, non ?
Envoyer la valeur au lieu d'une référence? C'est bien plus lourd avec un gros objet. En C++, la surcharge de l'opérateur ++ peut se faire sur des types volimuneux, pourquoi pas ?
Envoyer la valeur au lieu d'une référence? C'est bien plus lourd avec un gros objet. En C++, la surcharge de l'opérateur ++ peut se faire sur des types volimuneux, pourquoi pas ?
Je n'avais pas vu que ca parlait C++ au temps pour moi.
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Objectif Zéro Bug - le test logiciel professionnel | L'électronique de zéro | Tableaux & pointeurs | Pointeurs sur fonctions | Lecture/écriture binaire
Objectif Zéro Bug - le test logiciel professionnel | L'électronique de zéro | Tableaux & pointeurs | Pointeurs sur fonctions | Lecture/écriture binaire