palabras name keywords google etiquetas ejemplos definicion claves clave cientifico articulo c++ performance caching latency

c++ - name - palabras claves definicion



¿Todavía se usa la palabra clave de registro? (5)

Acabo de encontrar la palabra clave de registro en C ++ y me pregunté, ya que parece una buena idea (mantener ciertas variables en un registro) seguramente el compilador hace esto de forma predeterminada.

Entonces me preguntaba si todavía se usa esta palabra clave.


El estándar dice esto (7.1.1 (2-3)):

El especificador de registro se aplicará solo a los nombres de las variables declaradas en un bloque (6.3) o a los parámetros de la función (8.4). Especifica que la variable nombrada tiene una duración de almacenamiento automática (3.7.3). Una variable declarada sin un especificador de clase de almacenamiento en el ámbito del bloque o declarada como un parámetro de función tiene una duración de almacenamiento automática por defecto.

Un especificador de registro es una pista para la implementación de que la variable así declarada se usará en gran medida. [Nota: La sugerencia puede ignorarse y en la mayoría de las implementaciones se ignorará si se toma la dirección de la variable. Este uso está en desuso (ver D.2). - nota final]

En resumen: el register es inútil, vestigial, atávico y obsoleto. Su objetivo principal es dificultar la vida de las personas que intentan implementar clases autorregistradas y desean nombrar el register(T *) principal de funciones register(T *) .


La mayoría de las implementaciones simplemente ignoran la palabra clave register (a menos que imponga un error sintáctico o semántico).

El estándar tampoco dice que debe mantenerse algo en un registro; simplemente que es una pista para la implementación de que la variable se usará con mucha frecuencia. Su uso es incluso obsoleto.

7.1.1 Especificadores de clase de almacenamiento [dcl.stc]

3) Un especificador de registro es una pista para la implementación de que la variable así declarada será muy utilizada. [Nota: La sugerencia puede ignorarse y en la mayoría de las implementaciones se ignorará si se toma la dirección de la variable. Este uso está en desuso (ver D.2). - nota final]


No, no se usa. Es solo una pista, y muy débil. Los compiladores tienen asignadores de registro, pueden descubrir qué variables deben mantenerse en los registros (y dar cuenta de cosas que probablemente nunca pensaste).


Probablemente, el único uso remotamente serio de la palabra clave de register queda es una extensión de GCC que le permite usar un registro de hardware codificado sin ensamblaje en línea:

register int* foo asm("a5");

Esto significará que cualquier acceso a foo afectará el registro de la CPU a5 .

Esta extensión, por supuesto, tiene poco uso fuera del código de muy bajo nivel.


Solo el número específico de registros está disponible para cualquier programa C ++.

Además, es solo una sugerencia para el compilador, en su mayoría los compiladores pueden hacer esta optimización por sí mismos, por lo que no se usa mucho el uso de la palabra clave register y más porque los compiladores pueden o no seguir la sugerencia.

Por lo tanto, lo único que register palabra clave con los compiladores modernos es evitar que use & para tomar la dirección de la variable.

El uso de la palabra clave register solo le impide tomar la dirección de la variable en C, mientras que en C ++ al tomar la dirección de la variable solo hace que el compilador ignore la palabra clave register .

En resumen, ¡ simplemente no lo uses!

Bien explicado por Herb:
Palabras clave que no son (o, comentarios de otro nombre)