Bienvenidos sean a este post, hoy veremos uno de los tipos de memoria.
Los registros tienen una cantidad fija de informacion. A su vez estas permiten establecer el tamaño de WORD en la CPU, por ejemplo ocho o cuatro bytes. Otro particularidad es que no podemos acceder directamente a los registros desde C++ pero esto no es tan asi. Porque podemos usar la declaracion asm para poder modificarlos pero es una opcion no recomendada. Y en antiguas versiones tambien existia la palabra register para que esa declaracion se ingrese directamente en los registros pero nuevamente estas practicas podian ocasionar inconvenientes al momento de compilar nuestros codigos y por eso no son recomendables.
Vamos a analizar como trabajan los registros mediante el siguiente ejemplo:
auto numero{42};
for (int ix = 0; ix < 10000000; ++ix) {
int res{numero + ix};
// resto de instrucciones para manejar la variable res
}
La primer variable se definira automaticamente en el stack, no tiene nada que ver con auto, con lo cual podemos decir que este se asigna a la memoria virtual que no es otra que la memoria principal. Luego el bucle accedera a un objeto diez millones de veces y trabajaremos con este. Pero como podemos mejorarlo? Tomemos la primer variable y la modificaremos de la siguiente manera:
register auto numero{42};
Esto hara que la variable se agregue en los registros perooooo como dijimos anteriormente esto quedo obsoleto porque hoy los compiladores hacen mejores estrategias para mejorar la performance. Por ejemplo, el codigo anterior podemos mejorarlo de la siguiente manera:
for (int ix = 0; ix < 10000000; ++ix) {
int res{42 + ix};
// resto de instrucciones para manejar la variable res
}
Este codigo es mas rapido que el original porque ya no necesita leer la variable almacenada en la memoria para saber cual es su valor. Esta es una forma simple de como podemos optimizar nuestros codigos sin necesidad de realizar cosas raras.
Hasta aca podemos decir que todo lo que ejecuta el CPU es a traves de los registros. Inclusive las instrucciones que el CPU deberia decodificar y ejecutar son accedidas mediane un registro especifico, y a estos usualmente se los denomina como puntero de instruccion. Por lo tanto, cuando corremos un programa. El hecho de leer los datos desde la memoria principal y escribir datos a la memoria es realizado copiando desde y hacia los registros. Tambien existen registros de proposito general para mantener temporalmente los datos mientras la CPU ejecuta operaciones sobre los mismos. Para entender un poco mejor el concepto, veamos el siguiente ejemplo:
int a{40}, b{2};
int c{a + b};
Aqui iniciamos dos variables y en la siguiente almacenamos la suma de las variables y la asignamos a una tercera. Veamos como es en assembler:
mov eax, a
mov ebx, b
add eax, ebx
Como pueden ver movemos los valores de cada variable a un registro, para luego realizar la suma entre estos dos registros y asi moverlo a otro registro. Este es un ejemplo, lo cual no hace que sea obligatorio que el compilador mapea cada variable a un registro, recuerden que el numero de registros es limitado. Con esto comentado, una buena practica es mantener accedida variables pequeñas para que puedan encajar en un registro, y dejar que para objetos mas grandes sean manipulados por la memoria cache. Sobre este tipo de memoria, hablaremos en el proximo post.
En resumen, hoy hemos visto a los registros, que son, donde se ubican, como nos ayudan, para que realmente existen, y unos ejemplos para entenderlos. Espero les haya sido de utilidad sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.


Donatión
It’s for site maintenance, thanks!
$1.50
