2010-07-08 16 views
60

¿Cuál es la diferencia entreRegistro palabra clave en C++

int x=7; 

y

register int x=7; 

?

Estoy usando C++.

+0

mismo significado en C++ como en C, ergo esto es un duplicado: http://stackoverflow.com/questions/578202/register-keyword-in-c No utilice la palabra clave, está desactualizado Tiene "la misma semántica que un especificador automático junto con una sugerencia para la implementación de que el objeto así declarado se usará en gran medida."; sin embargo, cualquier compilador moderno sabe cómo hacer que el ensamblaje de salida sea mejor que usted, deje que haga su trabajo. – GManNickG

+7

@GMan: ANSI C no permite tomar la dirección de un objeto de registro; esta restricción no se aplica a C++ –

+1

@Brian: Hm, tienes razón. Es solo una nota ahora (que probablemente se ignorará si se toma la dirección), pero no obligatoria. Bueno saber. (Bueno, algo así como: P) – GManNickG

Respuesta

13

En C++, cualquier programa que sea válido y use las palabras clave "auto" o "registrar" será semánticamente idéntico al que se eliminaron (a menos que aparezcan en macros stringized u otros contextos similares). En ese sentido, las palabras clave son inútiles para la compilación adecuada de programas. Por otro lado, las palabras clave pueden ser útiles en ciertos contextos macro para garantizar que el uso incorrecto de una macro provoque un error en tiempo de compilación en lugar de producir un código falso.

+18

Un ejemplo del último bit puede ser útil. –

+0

Un buen artículo sobre el registro está aquí, pero use el traductor de google del checo al inglés, es válido: http://amapro.cz/public/programovani/c/register/register.php – user1141649

+10

Esta respuesta ya no es correcta, desde 2011 , la palabra clave 'auto' no se puede omitir simplemente ... Quizás podrías actualizar tu respuesta. – Walter

74

register es una sugerencia para el compilador, aconsejándole que almacene esa variable en un registro de procesador en lugar de memoria (por ejemplo, en lugar de la pila).

El compilador puede o no seguir esa pista.

De acuerdo a Herb Sutter "Keywords That Aren't (or, Comments by Another Name)":

Un especificador de registro tiene las mismas semántica que un especificador de auto ...

+1

créditos del enlace a @Fred Larson – Tom

20

con los compiladores de hoy en día, probablemente nada. Originalmente fue una pista para colocar una variable en un registro para un acceso más rápido, pero la mayoría de los compiladores ignoran esa sugerencia y deciden por sí mismos.

7

Casi nada.

register es una pista para el compilador que planea usar x mucho, y que cree que debería colocarse en un registro.

Sin embargo, los compiladores ahora son mucho mejores para determinar qué valores se deben colocar en los registros que el programador promedio (o incluso experto), por lo que los compiladores simplemente ignoran la palabra clave y hacen lo que quieren.

4

La palabra clave register era útil para:

  • montaje Inline.
  • Programación experta en C/C++.
  • Declaración de variables en caché.

Un ejemplo de un sistema productivo, donde se requiere la palabra clave register:

typedef unsigned long long Out; 
volatile Out out,tmp; 
Out register rax asm("rax"); 
asm volatile("rdtsc":"=A"(rax)); 
out=out*tmp+rax; 

Se ha dejado de utilizarse en C++17

+2

Y agregaría que la palabra clave 'register' solo sería útil en un microcontrolador que ejecuta un solo programa C++ sin hilos y sin tareas múltiples. El programa C++ debería ser el propietario de toda la CPU para asegurarse de que la variable 'registro' no se moverá de los registros especiales de la CPU. –

+0

@SantiagoVillafuerte ¿quieres agregarlo editando la respuesta? – ncomputers

+0

No estoy seguro de mi respuesta ... aunque suena plausible. Preferiría dejarlo como un comentario para que otros lo aprueben o lo desaprueben. –