++i est rapide pour les types complexes car tu ne dois pas realiser une copie. Realiser une copie d'un entier qui est perdue dans la nature ne coute rien. Executer une copie d'un iterateur de vector implique l'appel d'une methode, d'un constructeur, puis comme tu ne t'en sers pas, d'un destructeur.
La version ++i modifie l'objet "in-place" (sur place) donc bye bye l'appel au constructeur et au destructeur =)
Ensuite pour le envoi d'une valeur, ce n'est pas plus lent.
Dans le pire des cas, l'operateur ternaire se comporte comme un if, c'est a dire qu'il separe ton code en deux branches et effectue l'affectation. Dans le meilleur des cas, il realise une operation sans saut et place l'unique resultat dans un registre, un peu comme quand on fait a+b => realisation de l'operation et stockage du resultat dans un registre.
Pour que l'optimisation sans saut fonctionne il faut que tu lui files du code simple, par exemple un choix entre deux valeurs statiques.
Ci dessus,
est optimise sans saut avec des operations (pour ceux que ca interesse, le compilo genere le code suivant :Code:(test)?1:3;
il existe des tonnes de petites optims pour cela, quelles que soient les valeurs.Code:
1
2
3
4
5
6
7 __asm { XOR eax,eax //mets 0 dans eax TEST test SETLE eax //mets 1 dans eax si le resultat des test etait faux, sinon 0 ADD eax,eax+1 // ajoutes a eax eax+1, donc si eax vaut 0 ca vaut 1 sinon ca vaut 3 }
Mais si le resultat de ?: est a aller chercher dans une variable ou si il faut appeler une fonctio, pas de miracle, le compilo utilisera un saut jusqu'a la branche de code a effectuer.
Ca revient exactement au meme dans un if, mais la detection des optis possibles dans le if est plsu compliquee, a la rigueur tu aides le compilo avec :?
Donc moi quand il s'agit de se servir du resultat je prefere l'operateur ?: car il est comme une fonction (il renvoie une valeur)
quand il s'agit d'executer du code sans renvoyer de valeur j'utilise if puisque chaque bloc est comme une petite procedure (ne renvoie pas de valeur)
si le ?: devient trop complexe, alors je le vire et passe en if pour la lisibilité