Puntos a tener en cuenta para la escritura de código que es portátil para ambas arquitecturas de 32 y 64 bits

StackOverflow https://stackoverflow.com/questions/2254222

  •  20-09-2019
  •  | 
  •  

Pregunta

¿Cuáles son los puntos que se deben tener en cuenta al escribir código que debe ser portátil en las dos máquinas de 32 bits y 64 bits?

Pensando más en esto, siento si se puede añadir a su experiencia interms de problemas que enfrentan, que ayudaría.

La adición de más en esto, una vez enfrentado a un problema debido a la falta de un prototipo de una función que regresaba devolviendo un puntero. Cuando portado el mismo a una máquina de 64 bits, el código estaba fallando y yo no tenía ni idea de la razón desde hace bastante tiempo, más tarde se dieron cuenta de que todos los prototipos que faltan se supone que volver int causando el problema.

Cualquiera de estos ejemplos pueden ayudar.

EDIT:. Agregando a la comunidad wiki

¿Fue útil?

Solución

Gotchas:

  1. punteros de fundición a INTEGER tipos es peligroso
  2. Datos tamaños estructura puede cambiar
  3. ¡Cuidado con extensión de signo
  4. Diferente ABI?

Algunos consejos y trucos que he encontrado útiles:

  1. conseguirse un tipo de tamaño nativo entero (de un encabezado o typedef su propio) y utilizarlo cuando se tiene variables que no se preocupan por el tamaño.
  2. Utilice los tipos de variables explícitas siempre que sea posible (u_int64_t, int_32_t, etc.)

Otros consejos

  • Algunos tipos enteros pueden tener diferentes tamaños
  • Punteros son de diferentes longitudes
  • Estructura de relleno
  • Alineación

En Windows, sólo existe el convenio de llamada de 64 en comparación con el múltiple en una máquina x32 regular.

Las cosas se ponen más turbia cuando se tiene algunos componentes que son de 32 bits y de 64 bits alguna. En Windows, terminé escribiendo un servicio COM para hacerlos hablar.

Empujar punteros en la pila ocupa el doble de espacio. tamaño de la pila no puede cambiar entre las versiones del sistema operativo, sin embargo, causando código que funciona muy bien en el de 32 bits a fallar misteriosamente cuando se compila y ejecuta sin cambios en 64 bits. No me preguntes cómo lo sé.

sizeof (int) fuerzas! = Sizeof (void *)

alineación. Su posible que las necesidades alineaciones podrían cambiar. Esto puede exponer a los insectos en la que han estado maltratando cosas que deberían haber sido alineados pero sólo fueron alineados por accidente en 32 bits (o en un procesador que no le importa)

dont pase 0 en varargs si el receptor está esperando un puntero. Esto es doloroso en C ++, donde los desarrolladores inteligentes saben que el 0 es un puntero nulo válido. Un dev C se suelen utilizar NULL por lo que son probablemente bien

Escribir pruebas automatizadas y ejecutarlos regularmente en ambas plataformas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top