Mejor respuesta
> cat pointersize.c
#include
int main(){
int *ip;
printf(“pointer size: \%zu\n”, sizeof(ip));
}
> cc -o pointersize pointersize.c
> ./pointersize
pointer size: 8
> cc -m32 -o pointersize pointersize.c
> ./pointersize
pointer size: 4
Pointersize depende únicamente del modelo bajo el cual está compilando su código. No en el sistema operativo. Así que tengo un Linux de 64 bits, pero si obligo a gcc a compilar código de 32 bits, obtengo código ELF e i386 de 32 bits con un tamaño de puntero de solo 4 bytes.
Si obtienes 4 bytes en tu Windows, eso significa que tú todavía están compilando 32 bits y debería encontrar el interruptor para liberar todo el potencial de su máquina. ¡Desata el Kraken!
Acabo de comparar que ayer, entre el rendimiento del código i386 de 32 bits y el bdver2 x86\_64 (Piledriver, Haswell y superior) puede haber más del factor 5 en la ganancia de velocidad, no solo el uso del modelo de memoria más grande. En general, eso no es tan crítico, 4GB de memoria es suficiente para la mayoría de las aplicaciones.
Pero con solo 32 bits de código, comienza a perder las capacidades de MMX, SSE, SSE2,3,4 y muchos avances en ensamblaje sobre el últimos 35 años. Además del acceso más rápido para cualquier transferencia de datos, manipulación de bits, operaciones de cadenas, funciones matemáticas avanzadas y, y, y…
Aunque en algunos casos el código x86 original es una ventaja: no puede ¡supere la rigidez del código!
Editar: (y una pequeña perorata, puede ignorar)
Muy bien, siempre verifico el valor de oraciones como esa. Acabo de compilar x86\_64 vs 8086 código heredado. 53 bytes para x88\_64 frente a 74 bytes en el código heredado 8086 con un pequeño programa. Bueno … Si lo mantiene en 8/16 bits, esto podría ser cierto. Pero no con software moderno, programas C y compiladores. Entonces, no hay lágrimas por el hecho de que los viejos tiempos del legado se hayan ido. Seamos honestos: eran una mierda. Lo único bueno era que en ese entonces era joven y brillante. Pero eso tenía otras desventajas.
El punto es: nuestros procesadores modernos son realmente geniales. Ahora tenemos lo que solo teníamos en nuestros sueños en los 80. Por fin tenemos discos duros lo suficientemente grandes como para que no nos importe un byte o dos. Tenemos memoria lo suficientemente grande, si no manejamos Windows u otros acaparadores de recursos. Tenemos procesamiento vectorial en nuestra CPU y computación paralela total en nuestras GPU. Tenemos multinúcleos, FPU matemáticos, registros especializados como en MMX, SSE, SSEx, tenemos FMA3 y FMA4 (bueno, si tienes un procesador AMD, al menos, tienes que esperar mucho tiempo para tenerlo en tus manos), nosotros obtuvimos códigos de operación de ensamblaje altamente sofisticados que hacen todas las cosas interesantes en microcódigo o incluso en hardware para nosotros, muchas veces, solo se hacen en un ciclo, obtuvimos una memoria caché que es más grande que cualquier cosa con la que nos atreviéramos a soñar en los años 80 .
Y lo que «venía» en los 80 fue el CD y la idea de almacenar alucinantes gigabytes en una placa de plata barata era simplemente inimaginable. Y tenemos teléfonos con computadoras que son capaces de simular las computadoras centrales más grandes del 85 por un factor de 10000 de su velocidad o algo así.
¡Ahora tenemos todas las cosas interesantes!
¿Pero qué estamos haciendo con él? Twitteamos 144 caracteres. Ya nadie conoce las maravillas de los códigos de operación de ensamblaje de nuestros nuevos procesadores. Simplemente hacemos clic en el puto spam y eliminamos los sistemas Windows, que se calificaron como «desaparecieron pronto», «mierda», «¿qué haces con esa mierda» incluso en 1985, cuando comencé a estudiar.
No lo hizo Realmente ha mejorado con Windows. Todavía está plagado de errores y basura enviada por malware, que acapara las maravillas de nuestro hardware de computadora, que son tan sorprendentes que, si instalas un sistema operativo que se ajuste mejor a nuestro tiempo, te volará la mente. Especialmente como desarrollador.
El desarrollo de nuestros procesadores se está desacelerando con solo dos competidores en el mercado y debería ser el momento de dar rienda suelta a lo que ya tenemos: apagar esa mierda de 32 bits, comenzar a optimizar nuestro código de biblioteca en ensamblador donde podamos. Opcional, con siempre una alternativa a la «C» pura.
¿Y qué diablos es Twitter? Eso es una broma, ¿no? 144 caracteres? Eso no es serio, ¿o? ¿Se dieron cuenta del tipo de hardware que tenemos? No hay palabras en contra de Twitter, buen servicio, pero ya sabes a qué me refiero. Están pensando tan jodidamente pequeño y fallan incluso entonces.
Respuesta
Vas a odiar esta respuesta.
¿Listo?
Depende.
Un puntero es el tamaño de una dirección en la máquina para la que se está compilando el programa C.
- En el microprocesador Z80, popular en la década de 1980, un puntero tiene 16 bits.
- En el 8086 original, un puntero puede tener 16, 20 o 32 bits, aunque el espacio de direcciones tenga solo 20 bits de ancho. Tenías que darle al compilador de C un argumento de línea de comando que dijera qué tan ancho debería ser un puntero. Fue una pesadilla.Busque « modelo de memoria » en wikipedia para obtener una introducción larga y horrible.
- En el microprocesador 68000, los punteros eran de 32 bits.
- En el modelo x86 utilizado para los procesadores Intel hasta hace unos 5 años, y aún utilizable, un puntero era de 32 bits, lo que le permitía abordar unos 4 GB. Esta limitación conduce a la creación de direcciones de 64 bits.
- En el modelo x64 utilizado para los procesadores Intel de las últimas generaciones, un puntero es de 64 bits.
No puede Supongamos que un puntero tiene el mismo tamaño que un int, o el mismo tamaño que un long. La constante entera 0 se puede convertir en un puntero, pero otras constantes enteras pueden no ser convertibles. Cuando convierte 0 en un puntero, no hay garantía de que todos los bits contenidos en el puntero sean ceros, aunque esto es típico. Podría ser cualquier cosa. 0 es convertido en un puntero que apunta a una dirección no válida. Puede agregar un número entero a un puntero, lo que produce un puntero, o restar un número entero de un puntero, lo que produce un puntero. Cualquier otra cosa tiene un efecto indefinido.