Pregunta

Tengo algo como esto

register unsigned int a, b, c;
int n;
for (n = 0; n < 10; ++n){
c = a + b
b = a
a = c
array[n] = c;
}

lo que hace, no importa. El código se ejecuta rápidamente la forma en que es ahora, más lento si se elimina la palabra clave de registro. Sin embargo, cuando agrego en el registro antes de int n, que en realidad funciona más lento que ahora, pero más rápido que si no se usa registros.

Puede alguien explicar esto a mí? Gracias.

¿Fue útil?

Solución

register da el compilador de una pista para colocar la variable en un registro en lugar de espacio de memoria / pila. En algunos casos, no habrá suficientes registros para cada variable que coloque esta palabra clave en el modo de colocarlo en demasiadas variables puede obligar a algunos de los otros registros de nuevo.

Esto es sólo un toque, sin embargo, y el compilador no tiene que tomarlo.

Otros consejos

¿Cómo fue que el tiempo presente? En la práctica, register normalmente no hace nada. Es un trozo de costra de tecnología de compilación cuando era extremadamente primitiva y compiladores no pudo averiguar la asignación de registros sí mismos. Se suponía que iba a ser una pista para asignar un registro a esa variable y era útil para las variables utilizadas con mucha frecuencia. Hoy en día, la mayoría de los compiladores simplemente lo ignoran y asignar los registros de acuerdo con sus propios algoritmos.

En gcc, registro definitivamente no es ignorado, a menos que especifique las opciones de optimización. Probar su código con algo como esto

unsigned int array[10];

int n;

#define REG register

int main()
{
    REG unsigned int a, b, c;

    for (n = 0; n < 10; ++n){
        c = a + b;
        b = a;
        a = c;
        array[n] = c;
    }
}

a obtener (dependiendo de si se define REG o vacío)

diff http://picasaweb.google.com/lh/photo/v2hBpl6D- soIdBXUOmAeMw? hazaña = DirectLink

A la izquierda se muestra el resultado de usar los registros.

Hay un número limitado de registros disponibles, por lo que marca todo el registro no poner todo en registros. La evaluación comparativa es la única manera de saber si va a ayudar o no. Un buen compilador debe ser capaz de averiguar qué variables para poner en registros por sí solo, por lo que probablemente debería referencia un poco más antes de decidir que las palabras clave de registro de ayuda.

La idea de utilizar registro es, la variable se utiliza muy a menudo. Si no hay ninguna operación con la variable, que se copiará en un registro de todos modos. Así contador (variables de índice) son candidatos para este modificador. En el ejemplo de Diego Torres Milano del 15 Ene '10 a las 1:57 me gustaría hacer de esta manera:

unsigned int array[10];    

int main()
{
    register int n;
    unsigned int a = 1, b = 2, c;

    for (n = 0; n < 10; ++n){
        c = a + b;
        b = a;
        a = c;
        array[n] = c;
    }
}

Hay un límite a los registros asignables. Si outgo ella, que acaba de terminar con el código sea menos eficiente.

Mi opinión es que si lo que haces es tan importante que usted tiene que decidir lo que va a sí mismo en un registro y lo que no lo hace, usted debe escribir usando el lenguaje ensamblador.

Para lenguajes de propósito general, creo firmemente que un compilador es más capaz de decidir lo que pasa en un registro de un ser humano. La prueba de ello es que, si bien no está seguro de cuántas variables que se pueden poner en los registros, el compilador sabe con seguridad.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top