Estoy escribiendo una aplicación, y me pregunto si debería compilarla en modo de 32 bits o en modo de 64 bits. El programa no usa ningún tipo de 64 bits y no accede a más de 4 gigabytes de memoria (y no planeo que acceda a tanta memoria). La única ventaja que puedo ver al usar el modo de 64 bits sobre el modo de 32 bits es que el modo de 64 bits permite acceder a más registros, pero debe haber algún beneficio al usar el modo de 32 bits sobre el modo de 64 bits cuando la mayoría de las características de 64 bits no se están utilizando (aparte de instrucciones y punteros más pequeños, ya que no me preocupa que mi programa desborde el caché). ¿Hay algún beneficio en el uso de 32 bits, como instrucciones más rápidas o menos consumo de energía que deberían llevarme a la compilación de 32 bits? Gracias.

1
Cpp plus 1 24 feb. 2018 a las 19:04

5 respuestas

La mejor respuesta

Depende del tipo de aplicación.

Como otros mencionaron, las plataformas de 32 bits se consideran obsoletas, y la ejecución de aplicaciones de 32 bits en plataformas de 64 bits impone cierta sobrecarga. Además, como mencionó, hay más registros accesibles para el compilador y un conjunto de instrucciones más avanzado.

OTOH hay escenarios en los que el código compilado para 32 bits tendría una ventaja significativa, debido al menor tamaño de los punteros nativos.

Por ejemplo, tengo una aplicación con código "algorítmico", que trata con grandes conjuntos de datos almacenados en estructuras de datos complejas con punteros cruzados. La misma aplicación compilada para la plataforma de 32 bits tiene una huella de memoria significativamente menor y se ejecuta considerablemente más rápido.

De modo que si su aplicación no se acerca a la limitación de 32 bits, funciona con estructuras de datos complejas con punteros nativos, y el rendimiento es crítico: 32 bits puede ser un camino a seguir. De lo contrario, recomendaría cambiar a 64 bits.

2
valdo 24 feb. 2018 a las 16:30

WoW64 en Intel 64 (AMD64 / x64) no requiere emulación de instrucciones. En este caso, el subsistema WoW64 emula solo el entorno de 32 bits a través de una capa adicional entre una aplicación de 32 bits y la API de Windows de 64 bits. En algunos lugares esta capa es delgada, en otros un poco más gruesa. Para un programa promedio, puede esperar una penalización de rendimiento del 2% debido a esta capa. Para algunos programas, puede ser más grande. El dos por ciento no es mucho, pero tenga en cuenta que las aplicaciones de 32 bits funcionan un poco más lento en Windows de 64 bits que en el entorno de 32 bits.

La compilación de código de 64 bits no solo le permite evitar usar WoW64, sino que también le brinda una ganancia de rendimiento adicional. Esto se explica por modificaciones arquitectónicas en el microprocesador, como un mayor número de registros de uso general. Para un programa promedio, puede esperar una ganancia de rendimiento del 5-15% después de la recompilación sola.

Debido a la capa WoW64, los programas de 32 bits son menos eficientes en el entorno de 64 bits que en su entorno nativo de 32 bits. Sin embargo, las aplicaciones simples de 32 bits aún pueden obtener un beneficio de ser ejecutadas en el entorno de 64 bits. Quizás sepa que un programa creado con el modificador "/ LARGEADDRESSAWARE: YES" puede asignar hasta 3 Gbytes de memoria, si se inicia un Windows de 32 bits con el modificador "/ 3gb". Bueno, el mismo programa de 32 bits construido en un sistema de 64 bits puede asignar casi 4 Gbytes de memoria (en la práctica, generalmente es de aproximadamente 3,5 Gbytes).

PD Consulte también la "Lección 2. Soporte de aplicaciones de 32 bits en el entorno de Windows de 64 bits ".

1
AndreyKarpov 24 feb. 2018 a las 16:40

¿Por qué no compilarlo en ambos?

Recomiendo 64 bit (AMD 64). No hay ventajas de las aplicaciones de 32 bits (x86) aparte de la compatibilidad para computadoras realmente antiguas. Estoy seguro de que alguien más conocedor que yo puede señalar algunas ventajas técnicas de AMD 64 sobre x86, pero sospecho que eso no hará una diferencia real en su aplicación promedio.

Pero nada te impide compilar y distribuir ambos.

0
bolov 24 feb. 2018 a las 16:16

Tiene la mejora del acceso al registro en el modo de 64 bits correcto, pero puede que no sepa cuán dramática es la diferencia.

Por Wikipedia:

Comenzando con el procesador AMD Opteron, la arquitectura x86 extendida los registros de 32 bits en registros de 64 bits de forma similar a como Se realizó una extensión de 16 a 32 bits. Un prefijo R identifica los 64 bits registros (RAX, RBX, RCX, RDX, RSI, RDI, RBP, RSP, RFLAGS, RIP) y ocho registros generales adicionales de 64 bits (R8-R15) también fueron introducido en la creación de x86-64. Sin embargo, estas extensiones son solo utilizable en modo de 64 bits ...

En x86, la ejecución en modo de 64 bits le da acceso a 16 registros de 64 bits. En el modo de 32 bits, solo puede acceder a 8 registros de 32 bits.

Y dado que tres de los registros en cualquier caso son el contador de programa, el puntero de pila y el puntero de cuadro, la diferencia en los registros de propósito general disponibles es aún más dramática.

De modo que puede pasar de cinco o seis registros de 32 bits a 13 o 14 registros de 64 bits simplemente cambiando el indicador de compilación de -m32 a -m64.

A menos que tenga necesidades específicas para implementar en hardware o sistemas operativos anteriores de 32 bits, realmente no hay razón para compilar una aplicación x86 de 32 bits.

Solo tenga cuidado al portar código a 64 bits. Todavía hay demasiados programadores que combinan punteros y int sy long s.

1
Andrew Henle 24 feb. 2018 a las 16:46

Utilice 64 bits porque ejecutar 32 bits en un entorno de 64 bits tiene una sobrecarga (aunque pequeña).

1
Ctznkane525 24 feb. 2018 a las 16:06