Ehm... Je suis surpris que personne n'ait réalisé que le compilateur va simplement optimiser le test, et mettre un résultat fixe comme valeur de retour. Cela rend tous les exemples de code ci-dessus, effectivement inutile. La seule chose qui serait retournée est l'endianness à la compilation ! Et oui, j'ai testé tous les exemples ci-dessus. Voici un exemple avec MSVC 9.0 (Visual Studio 2008).
Code C pur
int32 DNA_GetEndianness(void)
{
union
{
uint8 c[4];
uint32 i;
} u;
u.i = 0x01020304;
if (0x04 == u.c[0])
return DNA_ENDIAN_LITTLE;
else if (0x01 == u.c[0])
return DNA_ENDIAN_BIG;
else
return DNA_ENDIAN_UNKNOWN;
}
Démontage
PUBLIC _DNA_GetEndianness
; Function compile flags: /Ogtpy
; File c:\development\dna\source\libraries\dna\endian.c
; COMDAT _DNA_GetEndianness
_TEXT SEGMENT
_DNA_GetEndianness PROC ; COMDAT
; 11 : union
; 12 : {
; 13 : uint8 c[4];
; 14 : uint32 i;
; 15 : } u;
; 16 :
; 17 : u.i = 1;
; 18 :
; 19 : if (1 == u.c[0])
; 20 : return DNA_ENDIAN_LITTLE;
mov eax, 1
; 21 : else if (1 == u.c[3])
; 22 : return DNA_ENDIAN_BIG;
; 23 : else
; 24 : return DNA_ENDIAN_UNKNOWN;
; 25 : }
ret
_DNA_GetEndianness ENDP
END
Il est peut-être possible de désactiver TOUTE optimisation à la compilation pour cette seule fonction, mais je ne sais pas. Sinon, il est peut-être possible de la coder en dur en assembleur, bien que ce ne soit pas portable. Et même dans ce cas, cela pourrait être optimisé. Cela me fait penser que j'ai besoin d'un assembleur vraiment merdique, d'implémenter le même code pour tous les processeurs/ensembles d'instructions existants, et bien.... peu importe.
De plus, quelqu'un ici a dit que l'endianness ne change pas pendant l'exécution. FAUX. Il existe des machines bi-endiennes. Leur endianness peut varier pendant l'exécution. De plus, il n'y a pas que le Little Endian et le Big Endian, mais aussi d'autres endianness (quel mot).
Je déteste et j'aime le codage en même temps...
4 votes
Dans un souci d'exhaustivité, voici un lien vers la question de quelqu'un d'autre concernant l'évaluation de l'endiannité (au moment de la compilation) : stackoverflow.com/questions/280162/
19 votes
Pourquoi ne pas déterminer l'endiveté au moment de la compilation ? Elle ne peut pas changer au moment de l'exécution.
3 votes
A priori, il n'existe pas de moyen fiable et universel de le faire. gcc.gnu.org/ml/gcc-help/2007-07/msg00342.html