[ Foro de C ]

Las variables "register"...

13-Apr-2010 01:44
Carlos Ruiz
2 Respuestas

Holap:

Estoy diseñando un programa en C, y para que corra más rápido, pretendo utilizar variables de tipo register (para los loops, etc...).

Sin embargo, hay algo que me gustaría saber:
Cómo puedo averiguar CUANTAS variables de tipo register puedo utilizar dentro de una función?

Help, pliss...

Saludooos :P


14-Apr-2010 18:42
Nacho Cabanes (+31)

No hay una respuesta única: la asignación de variables "register" depende de la estrategia de tu compilador y de cuantos registros haya disponibles en tu máquina de destino.

Por ejemplo, si estás programando para un procesador RISC, con muchos registros de propósito general, quizá varias de tus variables se almacenen en registros, sin necesidad siquiera de que tú uses la palabra "register". En cambio, si programas para un PC basado en la arquitectura X86 (que es con diferencia lo más habitual para un usuario "normal"), puedes encontrarte con que tú declares muchas variables como "register" y apenas dos, una o incluso ninguna se llegue a usar realmente en registros, porque la mayoría de registros de un X86 están diseñados para una función concreta.

Y lo que es peor, puede que un compilador no use la misma política que otro, de modo que algo que Borland C++ guarda en registro, no sea tratado igual por GCC. O incluso que cambie la política de una versión para otra, y algo que GCC versión 3 sí guardaba en registros no lo sea con GCC versión 4.

Por tanto, yo te diría:

- La mayoría de compiladores actuales optimizan el código generado, así que no deberías preocuparte por eso, y ya lo hará él si lo considera adecuado.

- Si aun así quieres intentar forzar, generalmente no tiene sentido que más de una o dos variables sean "register", o puede que el resultado sea contraproducente: que el compilador sólo vea un registro libre, y coloque en él una de tus variables, pero la menos eficiente de todas. Por ejemplo, es habitual que algo como la variable "i" que controla un bucle, que aumenta de uno en uno y que se compara con un valor final, se pueda optimizar si se guarda en un registro. Pero una variable que consultas una vez en todo un bucle no tiene sentido guardarla en un registro.

- Si quieres optimizar al máximo, puedes pedir a tu compilador que genere el código Ensamblador intermedio, haces varias pruebas con distintas cantidades de variables en "register", y analizas el código generado, para ver cómo se obtienen mejores resultados en ESE PROYECTO concreto (insisto: sólo en ese proyecto; quizá copies y pegues en otro proyecto y no se comporte igual, ni siquiera usando el mismo compilador, porque el nuevo proyecto tenga distinta cantidad de variables adicionales, o una lógica más compleja, o por cualquier otro motivo).

- En cualquier caso, esta debería ser la última optimización. Antes hay otras muchas que pueden acelerar tu código mucho más, como evitar comprobaciones innecesarias, realizar primero las comprobaciones que esperes que se cumplan con más frecuencia, cambiar las operaciones por otras más sencillas (por ejemplo x++ en vez de sumar 1, o sumar en vez de multiplicaciones simples, o hacer desplazamientos de bits en vez de multiplicar o dividir por potencias de dos, etc.).


18-Apr-2010 01:56
Carlos Ruiz

Holap:

Gracias por su pronta respuesta, estimado Nacho Cabanes... me ha quedado clarísimo...

Saludooos :P






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)