En mi corta programación, ha sido trivial compilar cualquiera de mis C ++, Java, etc. para una máquina de 32 o 64 bits siempre que tenga la fuente completa del programa.
Pero no se lanza una gran cantidad de software de 64 bits. Lo más molesto es que todavía no hay una versión de 64 bits del motor de Unity.
¿Qué hace que sea difícil compilar algunos programas para máquinas de 64 bits?
sizeof(int)==sizeof(void*)
operator*
paraint
, pero los punteros no necesitan eso. Además, la mayoría de los entornos Linux y Unix también tienenint
32 bits.Respuestas:
El problema general es que es muy fácil codificar supuestos indocumentados en un programa, y es muy difícil encontrar lugares donde se hicieron esos supuestos. Los lenguajes de alto nivel tienden a aislarnos un poco de estas preocupaciones, pero en los lenguajes de nivel inferior utilizados para implementar plataformas y servicios, es fácil hacer cosas que no son necesariamente portátiles en las arquitecturas:
Suponiendo que
int
sea lo suficientemente grande como para almacenar un punteroAsumiendo propiedades de la representación de punteros, por ejemplo, para el etiquetado de punteros
Suponiendo que los punteros de datos y los punteros de código tengan el mismo tamaño
También existe la preocupación práctica de la gestión de versiones. Si solo hago una compilación x86, todavía se ejecutará en x86-64, aunque tal vez más lentamente debido a la disponibilidad limitada de registros. Mientras que si construyo para x86 y x86-64, ahora debo probar en ambas arquitecturas y tratar con los errores que solo pueden surgir en una arquitectura, lo que aumenta el costo de envío de una nueva versión.
fuente
sizeof(int) == sizeof(void *)
(ambos son de 32 bits); en x86_64, es normal mantenerint
32 bits (sigue siendo compatible con x86 y evita desperdiciar espacio en la memoria), pero los punteros deben ser de 64 bits (ya que el espacio de direcciones virtuales sube a 2 ^ 64), por lo que ya no pueden serlo. empujado en unint
ounsigned int
.La mayoría del software funcionará igual cuando se compila para las arquitecturas Intel / AMD de 32 y 64 bits. Sin embargo, algunos programas no lo harán. Además de la pereza, o llegar a un público más amplio, hay algunas razones específicas por las que la recompilación como 64 bits no funcionará.
El software puede usar operaciones de puntero inseguras. Quizás un programa coloca un puntero en un int, que generalmente es de 32 bits para la mayoría de los compiladores de C y C ++. Los punteros son de 64 bits en un programa de 64 bits. Eso no funciona.
Las operaciones de desplazamiento de bits pueden producir resultados diferentes si el tipo entero que se utiliza es de un tamaño diferente. Esto puede ser un problema cuando se usa un tipo de datos regular en lugar de un tipo estándar definido como
int32_t
Un tipo de datos utilizado en una unión puede cambiar los tamaños, cambiando el comportamiento de la unión.
El software puede depender de bibliotecas que son solo de 32 bits. En general, un programa de 64 bits solo funcionará con bibliotecas de 64 bits debido a suposiciones sobre la pila, punteros, etc.
La dificultad que usted plantea en su pregunta es simplemente que en algunas bases de código puede haber millones de líneas de código que realizan operaciones inseguras, hacen suposiciones inseguras, tienen atajos y "optimizaciones" inteligentes implementadas por los desarrolladores. El código no se compilará en un entorno de 64 bits, o se compilará pero tendrá errores de show-stopper. Puede llevar mucho tiempo solucionar todos los problemas. Tal vez una compañía los arregle con el tiempo hasta que sea posible lanzar una versión de 64 bits. Tal vez una compañía desarrolle una "versión 2" junto con las versiones de mantenimiento actuales porque es necesaria una reescritura total.
La moraleja de la historia es escribir código limpio y no tratar de adivinar el compilador o agregar optimizaciones inteligentes que no son necesarias, pueden romper el software y, de todos modos, probablemente no ayuden.
Este artículo entra en mucho más detalle de lo que podría esperar incluir en esta respuesta: 20 problemas de portabilidad de código C ++ en la plataforma de 64 bits
fuente