Une possible intention pourrait être de maintenir l' eax
variable d'un registre. Si l'on regarde le projet de norme C99 , nous voyons que la section 6.5.3.2
l'Adresse et les opérateurs d'indirection dit (c'est moi qui souligne):
Unaire & opérateur donne l'adresse de son opérande. [...]Si l'opérande est le résultat d'une unaire * opérateur, ni que
l'exploitant de l'opérateur & est évaluée et le résultat est comme si les deux
ont été omis, sauf que les contraintes qui pèsent sur les opérateurs s'appliquent toujours
et le résultat n'est pas une lvalue.[...]
dans la note de bas de page 87 il est dit (c'est moi qui souligne à l'avenir):
Ainsi, &*E est équivalent à E (même si E est un pointeur null), et
&(E1[E2]) à ((E1)+(E2)). Il est toujours vrai que si E est une fonction
désignation ou une lvalue qui est valable un opérateur unaire &
l'opérateur, *&E est une fonction de désignation ou une lvalue égal à E.
nous retrouvons les suivants contrainte sur & operator
:
L'opérateur unaire & exploitant doit être soit une fonction
indicateur, le résultat d'un [] ou unaire * l'opérateur, ou une lvalue que
désigne un objet qui n'est pas un peu de champ et n'est pas déclaré avec
le registre de stockage de classe rédacteur de devis.
Ce qui est logique, puisque nous ne pouvons pas prendre l'adresse d'un registre et donc par la réalisation d'une adresse de fonctionnement ils peuvent avoir été d'essayer d'empêcher le compilateur d'effectuer les opérations complètement dans les registres et s'assurer que les données spécifiques dans les emplacements de mémoire sont modifiés.
Comme ouah points ce n'est pas d'empêcher le compilateur de l'optimisation de ce qui est effectivement un non-op de suite, mais comme documenté dans GCC hacks dans le noyau Linux. Linux s'est appuyé sur de nombreux gcc
extensions et considérant qu' 0.12
est un très ancien noyau, gcc
peut avoir la garantie que le comportement ou peuvent avoir, par accident, de manière fiable travaillé de cette façon, mais je ne peux pas trouver toute la documentation qui le dit.