windows - online - tag rename
Como programador, ¿de qué debo preocuparme cuando me muevo a Windows de 64 bits? (8)
Desde una perspectiva C / C ++ ....
Una cosa obvia es que el tamaño de un int se convertirá en 8 bytes en lugar de 4 bytes. Si alguno de sus códigos depende de eso, puede obtener resultados inesperados. La estructura y las alineaciones variables pueden cambiar. Es posible que pueda superarlo con un paquete #pragma, pero no soy muy fluido en las alineaciones y el embalaje.
Si usa cualquier unión con ints, el comportamiento puede cambiar.
Si está utilizando cualquier estructura de campo de bits, en función de los datos, los 32 bits adicionales pueden causar confusión. El bit de signo no estará donde pensaste que estaba.
Si codificas cualquier constante hexadecimal y esperas que los signos se vuelvan negativos, es posible que tengas problemas. El ejemplo 0x8000000 es un número negativo como un registro o entero de 32 bits. 0x80000000 como un número entero en una plataforma de 64 bits es un número positivo. para establecer directamente el bit de signo, debería usar 0x80000000 00000000 (espacio incrustado para legibilidad solamente)
También espero que size__t crezca apropiadamente. Si está haciendo asignaciones basadas en MAX_INT, serán mucho más grandes.
Para evitar este tipo de anomalías de tamaño, generalmente me quedo con largos en lugar de enteros.
La mayor parte de mi programación reciente ha sido en Windows de 32 bits usando C / C ++ / C # / VB6. Últimamente, mis clientes me preguntan si mi código se ejecutará en Windows de 64 bits.
Me pregunto qué características heredadas podría utilizar que se rompan en Windows de 64 bits. ¿Cuáles son algunos de los problemas del mundo real en los que debo pensar y preocuparme?
Obviamente, voy a probar mi código en el sistema operativo de 64 bits, pero me gustaría saber qué problemas comunes buscar. Me preocupan más los binarios existentes, pero estoy abierto a comentarios sobre qué preocuparme cuando vuelva a compilar (cuando sea posible).
EDITAR: Aquí hay una buena lista de errores de portabilidad de 64 bits.
Los programas de 32 bits funcionarán bien en las ventanas de 64 bits. Siempre que no esté haciendo ningún tipo de desarrollo de controlador de dispositivo, por supuesto.
Si compila su software como software de 64 bits la primera vez, debe tener en cuenta lo siguiente:
- un puntero tiene 64 bits de ancho, mientras que un int es de 32 bits. No guardes punteros en ints, tu código se romperá.
- El proceso de 64 bits necesita archivos DLL de 64 bits. Si depende de archivos DLL de terceros, asegúrese de que también se proporcionen en 64 bits. Si necesita comunicarse entre un proceso de 32 bits y un proceso de 64 bits, necesitará algunas de las muchas formas diferentes de IPC en Windows. Llamar a las funciones directamente está fuera de toda duda.
- Los directorios del sistema en Windows de 64 bits son diferentes que en Windows de 32 bits. Si tiene algunas rutas codificadas, es posible que deba verificarlas nuevamente.
Si está hablando de programas de 32 bits, no tiene prácticamente nada de qué preocuparse, ya que Windows 64 los ejecutará bajo emulación como de 32 bits. Cualquier problema con futuras versiones de Windows (por ejemplo, Windows 7) es probable que sean incompatibilidades en lugar de problemas con un sistema operativo de 64 bits.
Sin embargo, si su código administrado se compila para la plataforma de destino "Cualquier CPU" y realiza llamadas en código no administrado (p. Ej., PInvoke) o depende de otros ensamblajes, entonces hay algunas cosas que debe tener en cuenta. La publicación de Scott Hanselman sobre el CLR x86 / x64 cubre esto y es una buena explicación del CLR en Win32 / 64.
Al desarrollar programas nativos de 64 bits, la Guía de programación para Windows de 64 bits es una buena guía. En gran parte se reduce a los indicadores y el tamaño de los tipos de datos :)
En lo que a mí respecta, lo más importante acerca de portar código C / C ++ a Windows de 64 bits es probar tu aplicación con asignaciones MEM_TOP_DOWN
habilitadas (valor de registro AllocationPreference
) como se describe en Ajuste de 4 Gigabytes :
Para forzar que las asignaciones se asignen desde direcciones más altas antes de direcciones inferiores para fines de prueba, especifique
MEM_TOP_DOWN
cuando llame aVirtualAlloc
o establezca el siguiente valor de registro en 0x100000:
HKEY_LOCAL_MACHINE/System/CurrentControlSet/Control/Session Manager/Memory Management/AllocationPreference
¿Cuándo importa esto?
- Si tiene EXEs de 32 bits que se crearon con la opción de enlazador
/LARGEADDRESSAWARE
(o que tienen el indicadorIMAGE_FILE_LARGE_ADDRESS_AWARE
establecido en sus encabezados de PE a través de otros medios, comoeditbin.exe
), obtienen un total de 4 GB de virtual espacio de direcciones en Windows de 64 bits, y debe probarlos con el valor de registroAllocationPreference
establecido. - Si tiene archivos DLL de 32 bits existentes que pueden cargarse mediante EXEs de direcciones grandes, debe probarlos con el valor de registro
AllocationPreference
establecido. - Si vuelve a compilar su código C / C ++ en un EXE o DLL de 64 bits, debe probarlo con el valor de registro
AllocationPreference
establecido.
Si su aplicación C / C ++ cae en una de estas tres categorías y no prueba con asignaciones MEM_TOP_DOWN
, es muy poco probable que las pruebas detecten cualquier error de truncado / firma de puntero en su código.
La segunda cosa más importante, si usa MSVC y está recompilando código C / C ++ para 64 bits, es usar la opción del compilador /Wp64
para su compilación de 64 bits :
- Esto hará que el compilador emita advertencias para los tipos de letra que truncan los punteros o extienden tipos integrales más pequeños en los punteros (incluso cuando se usa
reinterpret_cast
o un molde de estilo C), así como algunos otros problemas de portadoras de 64 bits. - Sí, la documentación dice que en lugar de compilar con
/Wp64
debe usar un compilador que se/Wp64
a una plataforma de 64 bits, pero que solo no detectará los problemas de truncamiento / extensión del puntero en tiempo de compilación. Utilizar un compilador orientado a 64 bits y habilitar la opción de compilador/Wp64
para la compilación de 64 bits detectará muchos problemas de truncamiento / extensión de puntero en tiempo de compilación, y esto le ahorrará tiempo a largo plazo. - Desafortunadamente, con MSVC 2008, esto también producirá una "advertencia de línea de comando" para cada unidad de traducción que
/Wp64
opción/Wp64
está obsoleta. Puedo ver por qué la opción está en desuso para las compilaciones de 32 bits (donde es un hack malvado que requiere anotar muchos de sus typedefs), pero es desafortunado que también esté en desuso para las compilaciones de 64 bits (donde en realidad es útil).
Artículos:
20 problemas de portar el código C ++ en la plataforma de 64 bits
Los problemas olvidados del desarrollo de programas de 64 bits
64 bits, Wp64, Visual Studio 2008, Viva64 y todo lo demás ...
Detección de trampas durante la migración del código C y C ++ a Windows de 64 bits
Y
Herramienta Viva64 - para comprobar los programas de 64 bits:
Si realiza la inyección DLL por cualquier razón, tendrá problemas.
Es la emulación de 32 bits realmente a prueba de balas? He visto que el registro se presenta un poco diferente. Solo me pregunto qué cosas típicas no funcionan ...
Además, el directorio C: / windows / SYSTEM32 solo puede contener DLL de 64 bits. Si tiene una DLL de 32 bits, debe colocarla en C: / windows / syswow64 /
Puede ser más fácil migrar el código .NET si tiene un 100% de "tipo de código administrado seguro". Puede copiarlo a la plataforma de 64 bits y ejecutarlo correctamente con el CLR de 64 bits. Compruebe este enlace de MSDN al migrar el código administrado de 32 bits a 64 bits.
Btw, hanselman blogueó sobre el tema recientemente.