2010-10-06 11 views
33

¿Cuál es la diferencia entre nuestros punteros habituales (los que normalmente usamos), punteros cercanos y punteros lejanos y hay un uso práctico para los punteros cercanos y lejanos en los actuales sistemas C/C++? Cualquier escenario práctico que requiera el uso de estos punteros específicos y no otra semántica c, C++ será de gran ayuda.Punteros cercanos y lejanos

+0

@sbi Exactamente, nunca he visto o las usaron por encima de mi experiencia profesional y simplemente asegurar que no me estoy perdiendo de no saber sobre ellos :) –

+0

Pero están en 'C' y no en' C++ '... ¿no? ¿O me falta algo? – liaK

+1

@liaK: No están en ninguno de los dos. Están en algunas implementaciones falsas de ambos, y tales implementaciones no son conformes si usan 'near' y' far' como palabras clave (mientras que podrían ser conformes si usan '__near' y' __far' o '_Near' y' _ Far '). –

Respuesta

44

Las palabras clave de cerca y de lejos tienen su origen en el modelo de memoria segmentada que Intel tenía antes. Los punteros cercanos solo podían acceder a un bloque de memoria originalmente de alrededor de 64 Kb de tamaño llamado segmento, mientras que los punteros lejanos podían salir de ese rango que consiste en un segmento y desplazamiento en ese segmento. Los punteros cercanos fueron mucho más rápidos que los punteros lejanos, por lo que en algunos contextos valió la pena usarlos.

Hoy en día, con la memoria virtual, los punteros cercanos y lejanos no tienen uso.

EDIT: Lo siento si no estoy utilizando los términos correctos, pero así es como lo recordaba cuando estaba trabajando con él en su día :-)

+2

Hoy en día, los punteros "próximos" siguen siendo útiles; de hecho, ese es el tipo de puntero que ahora llamamos un "puntero". Todavía es posible crear un puntero lejano, pero es casi inútil en la mayoría de los sistemas operativos de 32 o 64 bits. – cHao

+5

@cHao: En realidad, no. En C y C++ se llaman __pointers, y solo punteros__. No era más que una arquitectura de procesador que requería compiladores diseñados para introducir extensiones no estándar. – sbi

+6

@sbi: Eran lo suficientemente comunes como para ser un estándar de facto, ISO y ANSI serían condenados. Gracias a Dios que se han ido, pero mientras estuvieron presentes, todos los compiladores C y C++ útiles en el mundo x86 (léase: una de las arquitecturas más comunes e importantes en existencia) tenían que tenerlos. Que no estaban en los estándares ISO/ANSI no los hace menos importantes, o menos "estándar" en el mundo real. – cHao