Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: class_OpenGL en 30 Noviembre 2015, 08:29 am



Título: (Consulta) Operador const_cast
Publicado por: class_OpenGL en 30 Noviembre 2015, 08:29 am
(Aquí cuento un poco como he llegado a mi duda, puedes leer un resumen abajo)

Hola, muy buenas. El caso es que acabo de encontrarme con este operador, el cual me parece un tanto curioso. Bueno, supongo que cada uno, cuando ha visto este operador, se ha hecho la pregunta ¿podré modificar el valor de una constante? Bueno, pues para probarlo, he elaborado el siguiente código:

Código
  1. #include <iostream>
  2.  
  3. int main() {
  4.    const int value_a = 5;
  5.    int *value_b = NULL;
  6.  
  7.    value_b = const_cast<int *>(&value_a);
  8.    *value_b = 6;
  9.  
  10.    std::cout << "&value_a = " << &value_a << std::endl; // Imprimimos direcciones
  11.    std::cout << " value_b = " << value_b << std::endl;
  12.    std::cout << std::endl;
  13.    std::cout << " value_a = " << value_a << std::endl; // Imprimimos valores
  14.    std::cout << "*value_b = " << *value_b;
  15.  
  16.    std::cin.get();
  17.    return 0;
  18. }

El resultado que he obtenido, es cuanto menos curioso:
Citar
&value_a = 0x9ffe34
 value_b = 0x9ffe34

 value_a = 5
*value_b = 6

Bueno, analicemos. Las dos variables, efectivamente, tienen la misma dirección (así que el casting parece haberse computado correctamente). La cosa es que para dos mismas direcciones de dos variables, ¡tenemos dos valores diferentes!

La duda, en resumidas cuentas es, ¿cómo es posible que para una misma dirección de memoria haya dos valores diferentes almacenados? ¿o a lo mejor sucede otra cosa?

Gracias :D


Título: Re: (Consulta) Operador const_cast
Publicado por: ivancea96 en 30 Noviembre 2015, 09:31 am
Es evidente que una idrección de memoria no guarda dos valores. El compilador se encarga de gestionar ahí el valor de la variable const.
La palabra const tiene una finalidad.

Si quieres que el compilador no haga estas mejoras, coloca la palabra "volatile" delante de la variable const, para decirle al compilador que esa variable puede cambiar.


Título: Re: (Consulta) Operador const_cast
Publicado por: class_OpenGL en 30 Noviembre 2015, 10:35 am
No lo entiendo. Las dos variables apuntan a la misma dirección. ¿Es que la memoria RAM se puede dividir en fragmentos? Gracias


Título: Re: (Consulta) Operador const_cast
Publicado por: ivancea96 en 30 Noviembre 2015, 10:52 am
El compilador no utiliza la dirección para sacar el valor. Lo da directamente. Es otro concepto.

Coge un editor de memoria como OllyDBG o Cheat Engine, y fíjate en los accesos a la dirección de memoria. Verás cómo trabaja.

En definitiva, el compilador no trabaja en ese momento con esa dirección de memoria.

De todos modos, const se utiliza si no vas a modificar el valor, tenlo en cuenta.


Título: Re: (Consulta) Operador const_cast
Publicado por: class_OpenGL en 30 Noviembre 2015, 11:16 am
Cita de: ivancea96
El compilador no utiliza la dirección para sacar el valor. Lo da directamente. Es otro concepto.

Eso es extraño, pero de acuerdo (supongo que se podría entender mejor si supiera ensamblador :S)

Gracias por tu respuesta :D

PD.:

Cita de: ivancea96
De todos modos, const se utiliza si no vas a modificar el valor, tenlo en cuenta.

También es verdad xD Solo tenía curiosidad!