J'ai quelques questions sur de l'optimisation de code.
Je travail sur un émulateur et l code suivant à pour but de lire un word stocké en big endian (sur une architecture little endian)
B = Base
A = Adresse
D = La donnée
1ère solution :
D = (B[A+0] << 8) | (B[A+1])
=> Je compte 2 accès mémoire (1 fois pour lire B[A+0] et une autre pour lire B[A+1))
2 ème solution :
1 2
| D = *((u16*) (B + A)) /* On lit le word à l'adresse B + A */
D = ((D & 0xFF) << 8) | ((D & 0xFF00) >> 8) /* On swap les bytes */ |
=> Je compte 1 accès mémoire mais plus d'opération (je suppose que D est travaillée dans un registre ...)
3 ème solution :
D = ((*((u16*) (B + A)) & 0xFF) << 8) | ((*((u16*) (B + A)) & 0xFF00) >> 8)
=> Équivalent à la deuxième mais écrit en une seule ligne.
Est ce que le compilateur va détecter que *((u16*) (B + A)) est présent deux fois et ne va faire qu'un seul accès mémoire ?
Merci pour l'aide que vous pourrez m'apporter.
Partager