La diferencia entre el software de 32 bits y el software de 64 bits es el tamaño de los punteros, y tal vez el tamaño de los registros de enteros. Eso es todo.
Eso significa que todos los punteros de tu programa tienen el doble de tamaño. Y (al menos en una arquitectura ILP32 / LP64) su long
s también tiene el doble de tamaño. Esto normalmente resulta en un aumento de alrededor del 30% en el tamaño del código de objeto. Esto significa que ...
- su código de objeto tardará un 30% más en cargarse desde el disco a la RAM
- su código de objeto ocupará ~ 30% más de espacio en la memoria
- ha reducido efectivamente el ancho de banda de su memoria (para código de objeto) en un ~ 20%
- ha reducido efectivamente el tamaño del caché de instrucciones en un ~ 20%
Esto tiene un efecto negativo no despreciable en el rendimiento.
Hacer esto solo tiene sentido si puede "recomprar" esos costos de rendimiento de alguna manera. Básicamente, hay dos formas de hacer esto: usted hace un montón de matemática de enteros de 64 bits, o necesita más de 4 memorias mapeadas de GiByte. Si uno o ambos son verdaderos, tiene sentido utilizar software de 64 bits, de lo contrario no lo es.
Nota: hay algunas arquitecturas donde no hay variantes correspondientes de 32 o 64 bits. En ese caso, la pregunta obviamente no tiene sentido. Los más conocidos son IA64, que tiene solo 64 bits y no tiene una variante de 32 bits, y x86 / AMD64, que están, aunque estrechamente relacionadas, diferentes arquitecturas, siendo x86 solo de 32 bits, AMD64 es de 64 bits solo un poco.
En realidad, esta última afirmación ya no es 100% cierta. Linux recientemente agregó el ABI x32, que le permite ejecutar código AMD64 con punteros de 32 bits, por lo que, aunque no es una arquitectura de CPU "adecuada", es una forma de usar la arquitectura AMD64 de tal manera como si tuviera un nativo Variante de 32 bits. Esto se hizo precisamente porque la sobrecarga de rendimiento que mencioné anteriormente estaba causando reales problemas cuantificables y cuantificables para usuarios del mundo real que ejecutan código del mundo real en sistemas del mundo real.