Eso depende mucho de la arquitectura subyacente de la máquina. Sin embargo, en general, la mayoría de las computadoras usan “números enteros” de algún tamaño (posiblemente con algunos bits especiales establecidos) como direcciones.
En los viejos tiempos, esos enteros no eran necesariamente del mismo tamaño que los enteros “normales”, a veces más grandes (las computadoras Prime usaban enteros de 48 bits como punteros, pero varios de los bits eran especiales y enteros de 32 bits normalmente) y a veces más pequeños (punteros en un CDC 6600 tenía 18 bits y los enteros normales casi 60 bits, solo eran “números de coma flotante” con un exponente especial). Había toda una serie de máquinas de Digital Equipment (y otros proveedores) donde dos enteros de tamaño de puntero cabían en un entero normal. Probablemente no quiera saber cómo se implementaron los punteros en el Data General Nova II, que tenía diferentes punteros de palabras y caracteres y que hizo que implementar el intérprete lisp dentro de RNL (una herramienta para diseñar lógica alguna vez) fuera un desafío: Mis primeros trabajos de contratación.
Con el dominio de C y “todas las máquinas son un Vax”, se usaron enteros de 32 bits como enteros normales y direcciones en la memoria. La mayoría de las arquitecturas modernas, x86, Mips, ARM, etc. Sigue alguna variación sobre eso. Si te fijas lo suficiente, quedan algunos si se usan enteros de 16 bits y punteros. Más frecuentes son las versiones donde se usan enteros y punteros de 64 bits.
- ¿Has tenido buenas experiencias con las computadoras portátiles Asus?
- ¿Cuál es la mejor computadora portátil para juegos? ¿Cuál preferiría HP, Dell o lenovo y mi presupuesto es de 40k-50k
- ¿Los procesadores i7 de doble núcleo son inferiores a los procesadores i5 de cuatro núcleos?
- ¿Cuál es la mejor configuración de CPU dentro de 15000 INR?
- ¿Puedo hacer un servidor usando placas base de laptop?
Ok, ya que quieres detalles. Aquí está el siguiente nivel. Para acceder a la memoria, uno tiene que saber la dirección específica de esa memoria. Érase una vez, la mayoría de las direcciones estaban codificadas en las instrucciones, por ejemplo, cargar el acumulador desde la dirección 5 (codificada como: lda 5). Sin embargo, para permitir matrices, los diseñadores de computadoras inventaron “registros de índice”, cargan el registro de índice con el subíndice en la ubicación 2 (ldx 2) y luego cargan el acumulador desde la dirección 5 suscrita por el índice (lda 5, x). Esto se hizo más avanzado al permitir el direccionamiento indirecto, cargar el acumulador con datos direccionados por la memoria en la dirección 5 (lda * 5). Ahora la ubicación 5 es un puntero. Sin embargo, si observa detenidamente, la operación de subíndice también es esencialmente un puntero. La sintaxis de C incluso hace eco de esto donde 5 [a] y a [5] significan lo mismo.
Ahora, las secuencias de instrucciones exactas utilizadas y la cantidad de valores permitidos dependen de la arquitectura, pero la mayoría de las máquinas ahora permiten el direccionamiento con direccionamiento indirecto de 32 bits (o 64 bits) y / o con registros de índice del mismo tamaño.
No conozco ninguna máquina actual que use espacios de direcciones separados para punteros. En un momento creo que hubo algunos, aunque nunca he usado uno. La semántica de C, que casi todos tienen que apoyar, hace que esta sea una propuesta perdedora. Los punteros son simplemente ubicaciones de memoria que contienen enteros que corresponden a las direcciones a las que queremos acceder. Esto no es un accidente: el compilador, el enlazador, el cargador, la biblioteca de tiempo de ejecución y el sistema operativo lo hacen así, pero no hay demasiado especial sobre esas ubicaciones.
La razón por la cual las máquinas como Primes y CDC desaparecieron es que los formatos de puntero especiales que no son simplemente enteros “normales” no son prácticos para implementar C de manera eficiente, y hacerlo es la métrica base por la cual se miden la mayoría de las computadoras modernas. Incluso la computadora en su teléfono inteligente cumple con ese estándar, porque eso hace que Android sea eficiente.
Ahora, ¿hay algo especial en las máquinas actuales que influyen en los enteros utilizados como punteros? Sí. Algún día pregunte sobre “tablas de páginas” y TLB o quizás sobre accesos no alineados y líneas de caché.