[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