elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  (Consulta) Operador const_cast
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: (Consulta) Operador const_cast  (Leído 1,182 veces)
class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
(Consulta) Operador const_cast
« 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


En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
ivancea96


Desconectado Desconectado

Mensajes: 3.414


ASMático


Ver Perfil WWW
Re: (Consulta) Operador const_cast
« Respuesta #1 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.


En línea

class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: (Consulta) Operador const_cast
« Respuesta #2 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
En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
ivancea96


Desconectado Desconectado

Mensajes: 3.414


ASMático


Ver Perfil WWW
Re: (Consulta) Operador const_cast
« Respuesta #3 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.
« Última modificación: 30 Noviembre 2015, 10:57 am por ivancea96 » En línea

class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: (Consulta) Operador const_cast
« Respuesta #4 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!
En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines