2010-02-03 15 views
8

Podría ser que estoy pasando por alto algo obvio, pero ¿dónde se almacenan los metadatos del puntero? Por ejemplo, si tengo un puntero int de 32 bits ptr y ejecuto ptr++ sabe avanzar 4 bytes en la memoria. Sin embargo, si tengo un puntero int de 64 bits, sabe avanzar 8 bytes. Entonces, ¿quién realiza un seguimiento de qué tipo de puntero es ptr y dónde está almacenado? Para simplificar, puede limitar esto a C++.¿Dónde se almacenan los metadatos del puntero?

+8

Respuesta corta: magic. Respuesta larga, no necesita almacenarse en ninguna parte, porque el compilador puede hacer la aritmética de puntero solicitada en tiempo de compilación. –

+0

Alok, deberías publicar eso como una respuesta. Es excelente. –

+0

De las preguntas frecuentes * 'Ninguna pregunta es demasiado trivial o demasiado' novato '.' *, Por lo que la etiqueta [n00b] es innecesaria y, en cualquier caso, está mal escrita. – dmckee

Respuesta

18

No se almacena en ningún lugar, per se. El compilador mira el tipo de ptr y convierte la operación ++ en un incremento del número correcto de bytes.

+0

Gracias. Ni siquiera consideré que podría computarse en tiempo de compilación. – bmalicoat

7

En el symbol table mientras se ejecuta el compilador. En ninguna parte, mientras que se ejecuta el programa, o más bien está implícito en el código de nivel inferior producido por el compilador.

2

No se almacena en ningún lugar, se determina en tiempo de compilación. De hecho, tome este código como un ejemplo:

int *abc = NULL; 
cout << abc + 1; /* Prints sizeof(int) */ 
cout << (void *)((char *)abc + 1); /* Prints 1. Casting it back to void * is necessary, 
      otherwise it will try to dereference it and print as a string. */ 
Cuestiones relacionadas