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 :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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.