Cuando preparaba mi anterior artículo Bucles invertidos, pude sorprenderme muy agradablemente con el optimizador de Visual C++ 7.1 (2003).

El código:

1
2
3
4
unsigned int i;
for (i=0; i<100; i++)
{
}

Queda compilado a nada. Es evidente que el bucle no realiza ninguna operación, por lo que el optimizador del compilador, lo detecta, y lo elimina.

Más sorprendente es:

1
2
3
4
5
unsigned int i;
for (i=0; i<100; i++)
{
}
return(i);

Se transforma a código ensamblador así:

1
2
mov	eax, 100
ret

Lo que si lo volviéramos a transcribir en C, sería:

1
return(100);

Como vemos, el propio compilador ha detectado código escrito pobremente, para en la medida de lo posible, mejorarlo.

También se puede apreciar, que la calidad del código generado es más que buena, superior a la que la mayoría de programadores sería capaz de escribir manualmente.

Evidentemente hay algunos casos, pocos afortunadamente, en los que el optimizador "se pasa de listo", y rompe código que sin optimizar funcionaba correctamente, pero eso es algo que poco a poco se va solucionando.

Todo ello, a pesar que en cuanto a eficiencia, Visual C++ 2003, no es ni de lejos el mejor compilador de C/C++. Lo que todavía impresiona más.

Con el nuevo GCC 4, el inminente Visual C++ 2005, y el recién salido Intel C++ 9, los optimizadores serán cada vez más inteligentes.