tipos significado registros parametros funciones estructuras ejemplos declaracion con c cpu-registers kernighan-and-ritchie kr-c

significado - registros en c++ pdf



¿Cuál es un buen ejemplo de uso de variable de registro en C? (5)

Otro caso común es cuando se implementan intérpretes de bajo nivel. Mantener algún estado en registros, ej. puntero de pila de la máquina virtual, puede reducir significativamente el acceso a la memoria y acelerar tu código.

Ver vmgen - un generador de intérpretes de máquinas virtuales eficientes para un ejemplo de la optimización (5.2 Almacenamiento en la parte superior de la pila).

Estoy leyendo K & R y llegué a la pequeña sección sobre variables de registro, y me preguntaba si la gente de aquí tiene algunos buenos ejemplos de esto puesto en práctica.

De la sección 4.7 en K & R:

La declaración de registro se ve como
registrar int x;
registrar char c;

Para ser claro, solo espero ver algunas muestras geniales de código. Estoy (estoy bastante seguro de que) entiendo el tema, así que no sienta la necesidad de escribir una explicación detallada (a menos que lo desee).


primero, la variable de registro debe usarse para variables muy utilizadas, como la variable de control de bucle para mejorar el rendimiento al minimizar el tiempo de acceso. secundario puede usar solo y solo registrar el especificador de almacenamiento en esta situación como, fun (auto int a, auto int b): error fun (registrar int a, registrar int b): a la derecha solo esto se ejecutará fun (static int a, static int b): error fun (extern int a, extern int b): error


Sé que esto es de bastante tiempo, pero aquí hay una implementación de un subprocedimiento de heapsort en el que el uso de variables de registro hace que el algoritmo sea más rápido, al menos usando gcc 4.5.2 para compilar el código

inline void max_heapify(int *H, int i){ char OK = FALSE; register int l, r, max, hI; while(!OK){ OK = TRUE; l = left(i); r = right(i); max = i; if(l <= H[SIZE] && H[l] > H[i]){ max = l; } if(r <= H[SIZE] && H[r] > H[max]){ max = r; } if(max != i){ OK = FALSE; hI = H[i]; H[i] = H[max]; H[max] = hI; i = max; } } }

Probé el algortihm con y sin la palabra clave register antes de los atributos y lo ejecuté para ordenar una matriz aleatoria con 50,000,000 de elementos en mi notebook, algunas veces para cada versión.

el uso de registros redujo el tiempo de heapsort de ~ 135s a ~ 125s.

También probé con 5.000.000 de elementos solamente, pero lo ejecuté más veces.

La versión sin el registro comenzó a los 11 s, pero cada ejecución bajó el tiempo hasta que llegó a 9,65 s y se detuvo en él

la versión con el registro comenzó en 10s y bajó el tiempo hasta 8,80s.

Creo que tiene algo que ver con la memoria caché. No obstante, parece que los registros hacen que el algoritmo sea más rápido por un factor constante

Dado que estas variables se utilizan bastante a lo largo del algoritmo, al asegurarse de que están en el registro en lugar de dejar este trabajo al compilador, se obtiene un mejor resultado en este caso. Sin embargo, no mejoró tanto el tiempo.

Espero que sea útil para alguien, saludos.


No hay un buen ejemplo de uso de registros cuando se usan compiladores modernos (léase: últimos 15 años o más) porque casi nunca hace ningún bien y puede ser algo malo. Cuando usa register, le está diciendo al compilador "Sé cómo optimizar mi código mejor que usted", que casi nunca es el caso. Una de tres cosas puede suceder cuando usa register:

  • El compilador lo ignora, esto es muy probable. En este caso, el único daño es que no puede tomar la dirección de la variable en el código.
  • El compilador hace honor a su solicitud y, como resultado, el código es más lento.
  • El compilador respeta su solicitud y el código se ejecuta más rápido, este es el escenario menos probable.

Incluso si un compilador produce un código mejor cuando usa el registro, no hay razón para creer que otro hará lo mismo. Si tiene algún código crítico que el compilador no está optimizando lo suficiente, probablemente su mejor opción sea utilizar el ensamblador para esa parte de todos modos, pero, por supuesto, hacer un perfil adecuado para verificar primero que el código generado sea realmente un problema.


En general, estoy de acuerdo con Robert , pero como cualquier buena regla, esta también tiene excepciones.
Si trabaja en un sistema profundamente integrado, es posible que sepa mejor que el compilador cómo optimizar el código para su aplicación específica en su arquitectura de hardware específica .

Pero en el 99% de los casos, la explicación de Roberts es buena para la palabra incrustada también.