Pourtant, je crois bien que les normes du C/C++ rendent ce code undefined pour x == 0 ou x == 32.
"If the value of the right operand is negative or is greater than or equal to the width of the promoted left operand, the behavior is undefined." si j'ai bien googlé.
Donc avec x == 0 ça marche.
Mais en effet, un peu plus le bordel avec x == 32.
L'argument de "l'exploitation des UB" pour optimiser les perfs des programmes tombe à l'eau
Dans ton exemple, de ce que j'ai suivi quand je suis tombé dessus c'est que c'est au niveau des CPU Intel (j'ai essayé de faire un un "uint32_t x=1; x << 32" et j'ai bien "1" en résultat) qui optimise en regardant que les premiers bits. Mais si je joue avec les shift SSE/AVX, de tête ça donne "0" donc si on fait du C pour SSE/AVX et que C définit la règle pour >=32, il me semble, si je ne dis pas trop de conneries, que ça ralentira l'un ou l'autre suivant la décision.
Ca se défend donc de laisser indéfini (le C/C++ est la pour ne pas pourrir la perf si le CPU ne fait pas pareil, ça se défend, si un langage dit que c'est OK et que ça décale quand même donc 0, on se retrouve à devoir tout le temps ralentir le shift en testant la valeur du shift avant de faire la commande au CPU), et je préfère que tu gères de ton côté le problème que d'imposer un ralentissement à tous.
[^] # Re: Existe-t-il des compilateurs C/C++ qui donnent une sémantique à tous les programmes ?
Posté par Zenitram (site web personnel) . En réponse au journal Compilateur trop intelligent. Évalué à 5. Dernière modification le 01 novembre 2017 à 13:38.
"If the value of the right operand is negative or is greater than or equal to the width of the promoted left operand, the behavior is undefined." si j'ai bien googlé.
Donc avec x == 0 ça marche.
Mais en effet, un peu plus le bordel avec x == 32.
Dans ton exemple, de ce que j'ai suivi quand je suis tombé dessus c'est que c'est au niveau des CPU Intel (j'ai essayé de faire un un "uint32_t x=1; x << 32" et j'ai bien "1" en résultat) qui optimise en regardant que les premiers bits. Mais si je joue avec les shift SSE/AVX, de tête ça donne "0" donc si on fait du C pour SSE/AVX et que C définit la règle pour >=32, il me semble, si je ne dis pas trop de conneries, que ça ralentira l'un ou l'autre suivant la décision.
Ca se défend donc de laisser indéfini (le C/C++ est la pour ne pas pourrir la perf si le CPU ne fait pas pareil, ça se défend, si un langage dit que c'est OK et que ça décale quand même donc 0, on se retrouve à devoir tout le temps ralentir le shift en testant la valeur du shift avant de faire la commande au CPU), et je préfère que tu gères de ton côté le problème que d'imposer un ralentissement à tous.
(encore une fois : si j'ai bien tout compris)