web-dev-qa-db-fra.com

Overflow signé en C ++ et comportement non défini (UB)

Je m'interroge sur l'utilisation du code comme ce qui suit

int result = 0;
int factor = 1;
for (...) {
    result = ...
    factor *= 10;
}
return result;

Si la boucle est itératée sur n fois, alors factor est multiplié par 10 exactement n fois. Cependant, factor n'est jamais utilisé après avoir été multiplié par 10 un total de n-1 fois. Si nous supposons que factor ne débordne jamais, sauf sur la dernière itération de la boucle, mais peut trop déborder sur la dernière itération de la boucle, alors ce code devrait-il être acceptable? Dans ce cas, la valeur de factor _ ne serait jamais utilisée après que le débordement ait eu lieu.

J'ai un débat sur si le code comme celui-ci devrait être accepté. Il serait possible de mettre la multiplication à l'intérieur d'une déclaration IF et de ne pas faire la multiplication sur la dernière itération de la boucle lorsqu'il peut déborder. L'inconvénient est qu'il cloque le code et ajoute une branche inutile qui devra vérifier sur toutes les itérations de la boucle précédente. Je pourrais aussi itérer sur la boucle une fois moins de temps et reproduire le corps de la boucle une fois la boucle, encore une fois, cela complique le code.

Le code actuel en question est utilisé dans une boucle interne étroite qui consomme un gros morceau du temps total de la CPU dans une application graphique en temps réel.

57
del

Pourquoi pas ceci:

int result = 0;
int factor = 10;
for (...) {
    factor *= 10;
    result = ...
}
return result;
1
Sieunguoimay