[gull] cours C++
Marc Mongenet
marc.mongenet at gmail.com
Mon Mar 6 13:50:09 CET 2006
2006/3/6, Daniel Cordey <dc at mjt.ch>:
> On Thursday 02 March 2006 13:49, Leopoldo Ghielmetti wrote:
>
> > Les procedures sont celles qui se comportent comme n'importe quelle
> > fonction C qui ne retourne pas de valeur et je les entoure par
> > do{...}while(0)
>
> En etant conscient que si la macro est incluse dans une boucle, un test
> suplementaire sera effectue a chaque fois + branchement. Suivant les
> architectures et les compilateurs, les "branch-prediction" peuvent etre assez
> differents et engendrer des variations de performances qu'il n'est pas facile
> a expliquer a premiere vue. C'est souvent assez "radical" sur les processeurs
> avec un long "pipeline". Maintenant, il se peut que l'optimiseur soit assez
> intelligent pour detecter l'utilisation de la constante '0' dans le test et
> supprimer la generation de l'encapsulation du bloc. Je sais que pas mal
> d'optimisation a ce niveau existe dans l'analyse des boucle 'for', mais je ne
> suis pas pesuade que cela soit aussi le cas dans les do-while. Donc,
> attention...
>
> dc
Les compilateurs (GCC 4.1 pour ces exemples) sont au rendez-vous :
void g(void);
int f()
{
do g(); while (0);
}
donne sur i386 (gcc -O3 -c -S c.c) :
f:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
call g
leave
ret
La boucle a disparu.
Ça va même un peu plus loin :
int f()
{
int i = 3;
do i++; while (i < 6);
return i;
}
nous donne :
f:
pushl %ebp
movl $6, %eax
movl %esp, %ebp
popl %ebp
ret
où l'on voit que le compilateur a lui-même calculé que i
vaut 6 en sortant de la boucle (qui a disparu du code compilé).
Sauf erreur, l'optimisation se fait dans GCC à un nouveau
d'abstraction inférieur à celui des boucles du langage C.
Marc Mongenet
More information about the gull
mailing list