Hay una biblioteca que compilo contra diferentes plataformas de 32 bits. Ahora, las arquitecturas de 64 bits deben ser compatibles. ¿Cuáles son las estrategias más generales para extender el código existente de 32 bits para admitir arquitecturas de 64 bits? ¿Debo usar # ifdef o cualquier otra cosa?Agregando soporte de 64 bit al código existente de 32 bit, ¿es difícil?
Respuesta
La cantidad de esfuerzo involucrado dependerá completamente de qué tan bien escrito esté el código original. En el mejor de los casos posibles, no habrá más esfuerzo que no sea volver a compilar. En el peor de los casos, tendrá que pasar mucho tiempo haciendo que su código sea "64 bits limpio".
problemas típicos:
- suposiciones acerca de tamaños de int/long/puntero/etc
- punteros asignación < => Ints
- que dependen de argumento predeterminado o conversiones resultado de la función (es decir, no hay prototipos de funciones)
- especificadores de formato printf/scanf inadecuados
- suposiciones sobre el tamaño/alineación/relleno de las estructuras (especialmente en lo que respecta a la E/S de archivos o redes) O interactuar con otras API, etc.)
- moldes inapropiados cuando se hace la aritmética de punteros con desplazamientos de bytes
Simplemente no confíe en la suposición del tamaño de la palabra de la máquina? siempre use sizeof, stdint.h, etc. A menos que dependa de diferentes llamadas de biblioteca para diferentes arquitecturas, no debería haber necesidad de #ifdefs.
La estrategia más fácil es construir lo que tienes con la configuración de 64 bits y poner a prueba a los diablos de la misma. Cierto código no necesita cambiar en absoluto. Otro código, generalmente con suposiciones erróneas sobre el tamaño de ints/pointers, será mucho más frágil y deberá modificarse para que no dependa de la arquitectura.
Muy a menudo los archivos binarios que contienen registros binarios causan la mayoría de los problemas. Esto es especialmente cierto en entornos donde los valores crecen de 32 bits a 64 bits en la transición a una compilación de 64 bits. Principalmente esto se debe al hecho de que los enteros se escriben de forma nativa en los archivos en su longitud actual (32 bits) y se leen usando una longitud incorrecta en una compilación de 64 bits donde los enteros son de 64 bits.
Depende del compilador, por supuesto, pero todos los compiladores C de 64 bits que he usado (gcc, clang), dejan 'int' en 32 bits y hacen' long' 64 bits. – JeremyP
@JeremyP: Depende del modelo de datos de plataforma (http://en.wikipedia.org/wiki/64- bit#Specific_C-language_data_models) en lugar del compilador. Por ejemplo, en Win64 tanto 'int' como' long' siguen siendo 32 bits, mientras que 'long long' es de 64 bits, por lo que el modelo es idéntico a Win32 para enteros, pero los punteros se convierten en 64 bits, por lo que el código intenta usar' int' o 'long' para mantener el valor de un puntero fallará - cambie a' intptr_t' donde sea necesario. – Clifford
- 1. Tamaños de estructuras en 32 bit y 64 bit
- 2. Convertir 32 bit dll a 64 bit dll
- 3. .net Utilidad InstallUtil - 32 bit vs 64 bit
- 4. .net console app 32 vs 64 bit
- 5. Ejecutando código de ensamblado de 32 bits en un procesador Linux y 64 bit de 64 bit: explique la anomalía
- 6. Python: aritmética bit a bit sin signo de 32 bit
- 7. ¿Por qué es esto más rápido en 64 bit que en 32 bit?
- 8. Error del ensamblador: Mach-O 64 bit no admite direcciones absolutas de 32 bit
- 9. Java performance 64 bit
- 10. Compilar ASP.NET a 64 BIT
- 11. ¿Cómo se determina el uso de ASP.NET de 32 bit frente a 64 bit?
- 12. CGFloat: redondo, piso, abs y precisión de 32/64 bit
- 13. manera portátil de lidiar con 64/32 bit time_t
- 14. dll de 32 bits en Office 64 bit
- 15. Identificación de la máquina de destino (32 bit o 64 bit) con implementación ClickOnce
- 16. Diferentes referencias de ensamblado .NET según 32-64 bit
- 17. Comprensión del tamaño de objeto CLR entre 32 bit frente a 64 bit
- 18. ¿Funciona con matlab de 32 o 64 bit?
- 19. Cuándo usar Eclipse 64 bit
- 20. Java 64 bit Pregunta JDK
- 21. 64 bit enum en C++?
- 22. Oracle Install para conectividad SSIS (y controladores 32 64 bit)
- 23. qt aplicación 64 bit windows
- 24. Cambios usando Winspool.drv en Windows 7 64 bit desde Windows XP 32 bit
- 25. SWT en Windows 64-bit
- 26. C# Access 64 bit Registro
- 27. Visual Studio 64 bit?
- 28. ¿Cómo obtengo libpam.so.0 (32 bit) en mi 64 bit RHEL6?
- 29. Debo usar Python 2.7 32 bit o 64 bit con Windows 7
- 30. Cómo puedo escribir un instalador para 32 y 64 bit
+1 Solo algunas adiciones: Un desagradable caso para los argumentos enteros son las funciones va_arg: todos los tipos enteros estrechos que corresponden al '...' se promoverán a 'int'. Entonces, el código que usa el entero 'typeof's con la semántica correcta como' size_t', 'uintptr_t',' ptrdiff_t', 'uint64_t' generalmente solo compila y ejecuta. Código que tiene abuso para 'int' en todas partes como variables de bucle,' 'aritmética' 'char' olvidando que esto podría estar firmado o no, y cosas así buscan problemas. Ejecute su código a través de diferentes compiladores con todas las advertencias activadas, 'clang' es un buen complemento a' gcc' –
@Jens: gracias por los comentarios adicionales; el punto de construir y probar con múltiples compiladores es muy bueno. –