2010-02-23 11 views
29

Estoy leyendo un libro y menciona cierto tipo de datos como puntero largo. Solo curiosidad por lo que eso significaba. Gracias.¿Qué es un puntero largo?

+1

Explicación histórica de MSDN: http://msdn.microsoft.com/en-us/library/windows/desktop/ff381404(v=vs.85).aspx –

Respuesta

36

Algunos procesadores tienen dos tipos de punteros, un puntero cercano y un puntero lejano. El puntero cercano es más estrecho (por lo tanto, tiene un alcance limitado) que un puntero lejano. Un puntero lejano también puede ser un puntero largo.

Algunos procesadores ofrecen direccionamiento relativo para cosas cercanas. Un puntero largo puede indicar que el artículo no está cerca y no se puede usar el direccionamiento relativo.

En cualquier caso, los apuntadores largos son un problema específico de la plataforma y pueden no ser portátiles para otros SO o plataformas.

Editar:(explicación adicional y el uso de direccionamiento relativo)

distancias de direcciones son menos de un concepto de alto nivel y más de un concepto de lenguaje ensamblador. La distancia se mide desde el contador del programa (ya sea la dirección actual o la dirección siguiente) y el inicio del objeto (función o datos). Si la ubicación es mayor que el límite para un puntero pequeño y relativo, será necesario un puntero más largo.

Ejemplo: Dado un sistema con direccionamiento "largo" de 32 bits y direccionamiento relativo de 8 bits. La distancia relativa permitiría al menos 127 bytes en dirección directa (valor positivo) o anterior (negativa). Si el objetivo está a 1024 bytes de distancia, se debe usar un puntero completo de 32 bits.

Esta es una función de optimización basada en el concepto de que la mayoría de las instrucciones y datos están cerca. La mayoría de los bucles tienen una pequeña distancia entre el inicio del bucle y el final del bucle. Estos emplean direccionamiento relativo para la ejecución.

La mayoría de los datos están cerca, ya sea una constante de datos o una variable. En más detalle, los datos están cerca de un marco o punto de referencia. Las variables locales se colocan en la pila, en relación con un marco o una dirección base. Esta dirección base es el inicio de la pila antes de que se ejecute la función. Por lo tanto, se puede acceder a los datos usando el direccionamiento relativo al inicio del marco de pila.

Los procesadores permiten que los compiladores usen instrucciones especializadas para el direccionamiento relativo (cercano). En muchos procesadores, las instrucciones para usar el direccionamiento relativo son más pequeñas que las instrucciones que usan una dirección larga. Por lo tanto, el procesador requiere menos recuperación del caché de instrucciones y el caché de instrucciones puede contener más instrucciones.

Direccionamiento largo y corto, cerca y lejos, puede depender del alcance de los datos o la función. Hay otros factores involucrados, como un PIC (código de posición indepent), memoria virtual y paginación.

+0

¿Está esta distancia medida por su alcance? ¿Cuántas veces lo encapsula? ¡Gracias! – numerical25

+0

@ numerical25: explique "¿Cuántas veces lo encapsula?". El direccionamiento no está encapsulado. –

+2

"scope" ya no existe en este nivel, solo una larga serie de bytes. Todo su código se traduce en ensamblaje, y eso se presenta en la memoria. Cuando las cosas están lo suficientemente juntas, el compilador genera punteros cercanos, cuando está más lejos el compilador necesita generar punteros lejanos. –

27

Dependiendo de la antigüedad del libro, podría estar refiriéndose a las arquitecturas segmentadas, donde había dos diferentes "tamaños" de puntero: punteros cercanos, que apuntaban al segmento local (y podían montarse en 16 bits), y punteros largos o lejanos, que podrían apuntar a otro segmento (y por lo tanto eran más grandes). Es por esto que ve tipos como LPVOID en la API de Win32: LPVOID es un "puntero largo (más lejano) para anular", es decir, un puntero a cualquier lugar en la memoria.

El uso de LP y NP es una resaca de Win16 y las arquitecturas de procesador segmentado de la época.En Windows moderno, con sus espacios de direcciones virtuales planas, los punteros cercanos y lejanos son generalmente de interés arqueológico solamente: solo hay un tipo de puntero y puede ignorar los calificadores "cercano" y "largo/largo".

+1

el libro está utilizando Direct X 9, MSVS C++ 2008 express. copyright 2010. Y algunos de los tipos de datos comienzan con LP. Pero recibo 2 respuestas diferentes, así que supongo que pueden significar 2 cosas diferentes. – numerical25

+0

¿Puedes definir Segmento? – numerical25

+0

Quizás podría publicar una de las menciones en contexto (por ejemplo, la oración en la que aparece); podríamos explicar más específicamente la importancia en ese contexto. P.ej. ¿Es solo una nota al margen que explica por qué algunos de los tipos de datos tienen el prefijo LP? – itowlson

Cuestiones relacionadas